0

I have a sentence like this:

Well, {hero}Superman X. 123 Sr.{/hero}, the most lovable guy was hated by {lover}Louis{/lover}.

I am using java regular exp. like this (which is not working: of course):

Pattern search = Pattern.compile("}.*{\/")

Actually it provides me this output:

}Superman X. 123 Sr.{/hero}, the most lovable guy was hated by {lover}Louis{/

When actually I want: "Superman X. 123 Sr." and then "Louis". How can this be achieved apart from running a while loop and increment the index? I can try that ..but was trying to know if there is an easier way that I am missing.

4

2 に答える 2

1

より良い正規表現があるかもしれませんが、これ(\{\w+\})([\w\.\s]+)(\{/\w+\})はあなたの仕事をします:

String test = "Well, {hero}Superman X. 123 Sr.{/hero}, the most lovable guy"+
                  " was hated by {lover}Louis{/lover}.";
Pattern p = Pattern.compile("(\\{\\w+\\})([\\w\\.\\s]+)(\\{/\\w+\\})");
Matcher m = p.matcher(test);
while(m.find()){
    System.out.println(m.group(2));
}
于 2012-12-06T04:28:29.927 に答える
0

これは、量指定子がデフォルトで貪欲であるためです。遅延量指定子が必要な場合は、.*?代わりに.*.

また、タグ自体をキャプチャすることもできます。

Pattern.compile("\\{([^}]+)\\}(.*?)\\{/\1\\}");

Java 正規表現の後方参照の現在の構文について 100% 確信があるわけではありませんが、動作するはずです。最終的に、キャプチャされた最初のサブパターン (heroまたはloverこの場合) にタグ名が含まれ、2 番目のサブパターンに名前自体が含まれます。

于 2012-12-06T04:32:27.560 に答える