正则表达式在Java中两个字符之间获取文本

时间:2019-02-19 21:28:29

标签: java regex

我有这个字符串:

Test 123 ${tag1} lorem ipsum ${tag2} ${tag3; tag4} ${tag5; tag6} dixit lorem ${tag7} dixit lorem ${tag8}.

我想使用一个正则表达式来仅选择$ {tag;标签}。

我尝试过:

\$\{(.*?)(; )(.*?)}

但无法达到我的期望。 有什么建议吗? 谢谢

1 个答案:

答案 0 :(得分:2)

如果${...;...}中的内部文本不能包含{};,请使用否定的字符类解决方案:

\$\{([^;{}]*);\s*([^{};]*)}

请参见regex demo

如果计划仅匹配单词char,则可以将其简化为

\$\{(\w+)\s*;\s*(\w+)}

请参见another regex demo

详细信息

  • \$\{-一个${子字符串
  • ([^;{}]*)-第1组:除;{}以外的任何0+个字符((\w+)将匹配1个或多个单词字符,字母,数字,下划线)
  • \s*;\s*-一个;包含0+空格
  • ([^;{}]*)-组2:除;{}以外的0个以上的字符
  • }-一个}字符。

Java demo

String s = "Test 123 ${tag1} lorem ipsum ${tag2} ${tag3; tag4} ${tag5; tag6} dixit lorem ${tag7} dixit lorem ${tag8}.";
Pattern pattern = Pattern.compile("\\$\\{(\\w+)\\s*;\\s*(\\w+)}");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
    System.out.println(matcher.group());
    System.out.println(matcher.group(1));
    System.out.println(matcher.group(2)); 
    System.out.println("=== END OF MATCH ===");
} 

输出:

${tag3; tag4}
tag3
tag4
=== END OF MATCH ===
${tag5; tag6}
tag5
tag6
=== END OF MATCH ===