2

文字列に次の任意の数を含めることができる正規表現を作成する必要があります。

  • 英数字
  • スペース
  • ((
  • )。

他の文字は使用できません。RegexBuddyを使用して、次の正規表現を作成しました。これは、RegexBuddy内でテストすると正しく機能します。

\w* *\(*\)*&*\.*

次に、RegexBuddyの「使用」機能を使用してこれをJavaコードに変換しましたが、単純なテストプログラムを使用すると正しく機能しないようです。

public class RegexTest
{
  public static void main(String[] args)
  {
    String test = "(AT) & (T)."; // Should be valid
    System.out.println("Test string matches: "
      + test.matches("\\w* *\\(*\\)*&*\\.*")); // Outputs false
  }
}
  • 正規表現に関しては、私には少し盲点があることを認めなければなりません。なぜそれが機能しないのか誰かが説明できますか?
4

4 に答える 4

13

その正規表現は、任意の量の空白、任意の量の英数字、任意の量の開き括弧、任意の量の閉じ括弧、任意の量のアンパサンド、および任意の量のピリオドをテストします。

あなたが欲しいのは...

test.matches("[\\w \\(\\)&\\.]*")

mmyersが述べたように、これにより空の文字列が許可されます。空の文字列を許可したくない場合...

test.matches("[\\w \\(\\)&\\.]+")

ただし、スペースのみ、またはピリオドのみなどの文字列も使用できます。少なくとも1つの英数字を確保する場合は...

test.matches("[\\w \\(\\)&\\.]*\\w+[\\w \\(\\)&\\.]*")

したがって、正規表現が何を言っているかを理解できます...角かっこ( "[]")内のすべてが文字のセットを示します。したがって、「a *」が0個以上のaを意味する場合、[abc] *は0個以上の文字を意味し、すべてがa、b、またはcです。

于 2009-04-22T16:03:13.100 に答える
4

私はあなたの説明を誤解しているかもしれませんが、あなたは本質的に特定の順序ではなく順序なしで文字のクラスを定義していませんか?正規表現の構造を[xxxx]+にするべきではありません。ここで、xxxxは実際に必要な文字です。

于 2009-04-22T16:03:00.307 に答える
4

JavaコードスニペットとRegexBuddyの[テスト]タブの違いは、Javaのmatches()メソッドでは文字列全体に一致する正規表現が必要であるのに対し、RegexBuddyの[テスト]タブでは部分的な一致が許可されることです。RegexBuddyで元の正規表現を使用すると、黄色と青の強調表示の複数のブロックが表示されます。これは、RegexBuddyが文字列内で複数の部分一致を検出したことを示しています。matches()で意図したとおりに機能する正規表現を取得するには、テスト対象全体が黄色で強調表示されるまで、または強調表示をオフにした場合は、[最初の検索]ボタンでテキスト全体が選択されるまで編集する必要があります。

または、正規表現の最初と最後にアンカー\Aと\Zを使用して、文字列全体に一致させることもできます。これを行うと、RegexBuddyでテストする場合でも、Javaでmatches()または別のメソッドを使用する場合でも、正規表現は常に同じように動作します。完全な文字列の一致が必要なのはmatches()のみです。Javaの他のすべてのMatcherメソッドでは、部分一致が許可されています。

于 2009-04-23T12:30:15.630 に答える
2

正規表現

\w* *\(*\)*&*\.*

あなたが説明したアイテムをあなたに与えるでしょう、しかしあなたが説明した順序でのみ、そしてそれぞれは望むだけ多くすることができます。したがって、「skjhsklasdkjgsh((((())))))&&&&& .....」は機能しますが、文字を混合することはできません。

次のような正規表現が必要です。

\[\w\(\)\&\.]+\

これにより、すべての文字を組み合わせることができます。

編集:私の正規表現の知識は限られているので、上記の構文は完全ではないかもしれません。

于 2009-04-22T16:06:14.620 に答える