1

正規表現の文字列を作成することになると、私は迷子になります。次のような正規表現が必要です。

私は次の文字列を持っています:

[~class:obj]
[~class|class2|more classes:obj]
[!class:obj]
[!class|class2|more classes:obj]
[?method:class]
[text]

文字列には、上記の内容を複数含めることができます。文字列の例は「[if][!class:obj]」です。

[]の間に何があり、マッチグループに分けられているのか知りたいです。たとえば、最初の一致グループは、存在する場合は記号(〜|!|?)であり、次に:の前にあるものであるため、classまたはclass | class2 | etc ...となり、:との右側にあるものになります。 ]の前で停止します。:とその前にあるものはないかもしれませんが、[]の間に何かがあります。

では、この正規表現をどのように作成すればよいでしょうか。また、一致グループ名を付けて、何が一致したかを知ることはできますか?

これはJavaプロジェクト用です。

よろしくお願いします。

4

4 に答える 4

1

役立つかもしれないいくつかのウェブサイトはここにあります:

于 2012-07-24T19:29:40.153 に答える
1

入力が十分にあると確信している場合は、おそらく。のようなものを使用できます/\[(\~|\!|\?)?(?:((?:[^:\]]*?)+):)?([^\]]+?)\]/。(これをJavaに変換するには、円記号をエスケープし、スラッシュの代わりに引用符を使用する必要があります)

于 2012-07-24T19:36:31.867 に答える
1

私はこれがうまくいくはずだと信じています:

/[(.*?)(?:\|(.*?))*]/

また:

[a-z]*
于 2012-07-24T19:37:26.403 に答える
1

このコードを試してください

final Pattern
  outerP = Pattern.compile("\\[.*?\\]"),
  innerP = Pattern.compile("\\[([~!?]?)([^:]*):?(.*)\\]");
for (String s : asList(
    "[~class:obj]",
    "[if][~class:obj]",
     "[~class|class2|more classes:obj]",
     "[!class:obj]",
     "[!class|class2|more classes:obj]",
     "[?method:class]",
     "[text]"))
{
  final Matcher outerM = outerP.matcher(s);
  System.out.println("Input: " + s);
  while (outerM.find()) {
    final Matcher m = innerP.matcher(outerM.group());
    if (m.matches()) System.out.println(
       m.group(1) + ";" + m.group(2) + ";" + m.group(3));
    else System.out.println("No match");
  }
}
于 2012-07-24T19:40:31.727 に答える