1

弦:

水、ラウレス硫酸ナトリウム、ラウリル硫酸ナトリウム、ジメチコン、コカミドMEA、炭酸亜鉛、ジステアリン酸グリコール、塩化ナトリウム、ピリチオン亜鉛、キシレンスルホン酸ナトリウム、セチルアルコール、香料、グアーヒドロキシプロピルトリモニウムクロリド、硫酸マグネシウム、安息香酸ナトリウム、ラウレス硫酸アンモニウム、マグネシウム水酸化炭酸塩、リナロール、ブチルフェニル メチルプロピオナール、リモネン、ヒドロキシイソヘキシル 3-シクロヘキセン カルボキシアルデヒド、ベンジル アルコール、ヘキシル シンナマル、シトロネロール、酢酸トコフェロール、パラフィン液、ポリナフタレンスルホン酸ナトリウム、CI 19140、DMDM ヒダントイン、CI 15510、メチルクロロイソチアゾリノン、EDTA 二ナトリウム、四ナトリウムメチルイソチアゾリノン。

現在の正規表現:

System.out.println(string.matches("([\\W]*\\b[A-Z\\d]\\w+\\b[\\W]*)+"));

Java アプリケーションがハングアップします。正規表現でエラーが見つかりません。ググってみたら、これは「破滅的な後戻り」と言える!? たとえば、大文字の単語のみが含まれている場合、正規表現は文字列と一致する必要があります。たとえば、1 つの単語が小文字であり、一致しない必要があります。

4

2 に答える 2

1

入力文字列を単語ごとに分割し、それをパターン マッチすることをお勧めします。イベントは簡単です。次のように、各単語の最初の文字が大文字であることをテストするだけの場合は、パターン マッチを行わないでください。

for (String s : string.split("\\W")) {
  if (s.charAt(0) < 'A' || s.charAt(0) > 'Z') {
    return false;
  }
}

私にははるかに高速に聞こえます (必要に応じて、失敗した単語を使用することもできます)。

于 2012-08-30T10:13:29.690 に答える
0

おそらくあなたが考えていたのは

String regex = "([A-Z][\\d\\w]+( [A-Z][-\\d\\w]+)*, )*[A-Z][-\\d\\w]+( [A-Z][-\\d\\w]+)*\\.";
System.out.println(string.matches(regex));

true を返します。

正規表現の問題は、過度に複雑であることです。納得いくまで式を追加することのデメリットは、意図しtrueていなかったものと一致する可能性があることです。

Random rand = new Random();
while(true) {
    byte[] bytes = new byte[40];
    rand.nextBytes(bytes);
    for (int i = 0; i < bytes.length; i++) bytes[i] &= 0x7F;
    String string = new String(bytes, 0);
    if (string.matches("([\\W]*\\b[A-Z\\d]\\w+\\b[\\W\\d]*)+"))
        System.out.println(string);
}

次のようなものを印刷します

"^;%XX`'SwJ|[*4"*0C<Tgbom_. \^
{PvU_y9aJSm?08EL(   NpfA9a[:$YbN8VTtMk
;![`LR7Yy\AO5PZ@X4}GajC<*XvKE11
8l5W6*IDNH[9C'@.>7`LHsCN*,{26O}
EFJ5MBVxi%W_t6v54EmLmgjFvqyYh\<"
+7]|ULh2[MT`Yx{MKH4N
'8p!2mf

私が与えた式は一致します

KfhBuGv7, S3.
IWzu, XHop4Z.
LJbXfrd, PdR.
V2dxQV, LA9z.
HKf37cy0, TS.
RAw2E5a, Ajs.
Up-, GPQ7 I_.
于 2012-08-30T10:10:43.993 に答える