4

私は、同僚を楽しませるために机に頭をぶつけているところです。現在、次の正規表現があります

(^[\w](( \w+)|(\w*))*[\w]$)|(^\w$)

私がやりたいことは、英数字のみを含み、先頭または末尾の空白を含まず、単語間に1つ以上のスペースを含まない文字列と一致させることです。

この場合の単語は、1 つ以上の英数字として定義されます。

これは私が望むもののほとんどに一致しますが、テストから、2番目以降の単語の長さは2文字以上でなければならないと考えています.

テスト:

ABC - Pass
Type 1 - Fail
Type A - Fail
Hello A - Fail
Hello Wo - Pass
H A B - Fail
H AB - Pass
AB H - Fail

私が間違っているアイデアはありますか?

4

3 に答える 3

9

あなたの正規表現は近いです。2 文字の問題の原因は次のとおりです。

(^[\w](( \w+)|(\w*))*[\w]$)|(^\w$)
       right here ---^

group ( \w+)、つまりスペースの後に 1 つ以上\wの が続き、最初の単語の後のすべての単語がスペースのために一致しなければならない場合、別の必須\wの単語があります。これは、文字列の最後の単語に 2 つ以上の文字が必要です。それを取り出してください。問題ありません。

(^[\w](( \w+)|(\w*))*$)|(^\w$)

より単純なバージョンは次のようになります。

^\w+( \w+)*$
于 2013-03-04T15:09:41.793 に答える
2

POSIX クラスで PCRE を使用する

まず、ダッシュが含まれているため、コーパスをクリーンアップする必要があります。次に、確実に失敗する行を 1 つか 2 つ追加して、テストのための悲しい道を作ります。これにより、次のコーパスが生成されます。

# /tmp/corpus
ABC
Type 1
Type A
Hello A
Hello Wo
H A B
H AB
AB H
ab $ cd

次に、英数字の値のみを含む POSIX クラスで、固定された Perl 互換の正規表現を使用します。末尾のスペースを防ぐために否定先読みを使用しますが、単語間には単一のスペースを許可します。

$ pcregrep '^([[:alnum:]]+(?!= $) ?)+$' /tmp/corpus
ABC
Type 1
Type A
Hello A
Hello Wo
H A B
H AB
AB H

予想どおり、これにより、期待していた 8 つの有効な行が生成されます。成功!

于 2013-03-04T15:27:41.373 に答える
0

\w would matches _ as well as alphanumerics. So if you don't want to match underscores you'd have to use [a-zA-Z\d] instead.

The following expression should cover your needs:

^[a-zA-Z\d]+(?: [A-Za-z\d]{2,})*$

Alternatively you could use the following if {min,max} repetition is not supported.

^[A-Za-z\d]+(?: [A-Za-z\d][A-Za-z\d]+)*$

We need the {min,max} or double character group because of your requirement of minimum 2 characters from the second word onwards.

If underscores are allowed then the following expressions would be better:

^\w+(?: \w{2,})*$

or without {min,max}:

^\w+(?: \w\w+)*$

于 2013-03-04T15:34:42.403 に答える