1

単純な正規表現を機能させることができません。現在、次のJavaコードがあります。

String regex = "^([^A-Za-z]*?[A-Z][A-Za-z]*?)+.?";
String string = "AQUA, CETEARYL ALCOHOL, CETYL ESTERS, BEHENTRIMONIUM CHLORIDE, CETRIMONIUM CHLORIDE, AMODIMETHICONE, TRIDECETH-12, PARFUM, METHYLPARABEN, HEXYL CINNAMAL, LINALOOL, BENZYL SALICYLATE, LIMONENE, LAMINARIA DIGITATA, CHAMOMILLA RECUTITA , ANICOZANTHOS FLAVIDUS, SODIUM BENZ0ATE, PHENOXYETHANOL, ETHYLPARABEN, BUTYLPARABEN, PROPYLPARABEN, P0LYS0RBATE 20, CI 19140, CI 14700.";
System.out.println(string.matches(regex)); 

問題は、実行が決して終了しないことです。私の正規表現は、私がどのように失敗するかを確認するためにのみ使用してください。必要なものは私には単純に聞こえます:-任意のテキストがあります。-このテキストのすべての単語は大文字である必要があります。-単一文字がある場合は、それらも大文字にする必要があります。-(数字、コンマ、...)の間は常に一致する必要があります。上記の複雑なサンプルを参照してください。シンプルなのは:

テスト、テスト、テスト= true
テスト、テスト、テスト= false
テスト、7-テストテスト、テスト= true
テスト、7-テストテスト、テスト= false
na = false
NA = true
N / A = true
フェノキシエタノール、P0LYS0RBATE 20、CI 19140、CI14700。= true

どうもありがとう!!!

4

4 に答える 4

1

これは、提供したすべての入力で機能するようです。

"^((^|[^A-Za-z]+)[A-Z][A-Za-z]*)*[^A-Za-z]*$"

バリデーターがどのように機能するかはわかりませんが、両端に^と記号を追加して文字列全体を強制的に一致させることは問題ありません。$

使用したグループが多すぎて*(ゼロ以上に一致)、状態空間が爆発したため、正規表現が終了することはありません。+グループでaを使用する方法に注目してください[^A-Za-z]。これにより、一致グループ間で少なくとも1つの非文字が一致するようになります。これにより、一致数が妥当な数に保たれます。ただし、私のものは完全な文字列(で始まり、^で終わる$)に一致するため、とにかく単一の一致しか見つけることができません。

編集:

空の文字列を一致させたくない場合は、最後*から2番目を+:に変更します。

"^((^|[^A-Za-z]+)[A-Z][A-Za-z]*)+[^A-Za-z]*$"
于 2012-08-31T13:06:45.353 に答える
0

区切り文字を使用する方が適切です。たとえば、文字列トークンを使用してからチェックすると、はるかに簡単になります。'、'を区切り文字として使用し、各トークンをトリミングして正規表現で確認します。

于 2012-08-31T12:30:12.123 に答える
0

これはあなたのために働くかもしれません

文字列正規表現="^([A-Z0-9] + [A-Za-z0-9、./ \-] \ s)+ $";

さらにいくつかの区切り文字を追加する必要がある場合があります(例では、。/および-)

于 2012-08-31T12:33:30.967 に答える
0

多分この正規表現はあなたのために働きます:

\p{Upper}*[^\p{Lower}]*\p{Upper}*

その意味は:

\p{Upper}任意の大文字

[^ \p{Lower}]小文字以外の任意の文字

obs:空のテキストも一致します

于 2012-08-31T12:35:10.140 に答える