java正则表达式 - 查找所有元素

时间:2016-11-23 15:00:52

标签: java regex

我将内容作为字符串:

{1:F01[some data there]}{2:I515[some data there]}{4::[multiple data there]}{5:{TNG:}}
{1:F01[some data there]}{2:I515[some data there]}{4::[multiple data there too]}{5:{TNG:}}
{1:F01[some data there]}{2:I515[some data there]}{4::[some data there]}{5:{TNG:}}

我想找到每条记录。记录以{1}开头,以{5}结尾。 我已经写了这个正则表达式:

(\{1:F01)?.*(\{2:)?.*(\{5:\{TNG:\}\})?

但我总是得到包含每条记录的全部内容。 怎么办?

2 个答案:

答案 0 :(得分:1)

正则表达式匹配每个类似因素,因为{1{5可选?,而.*会尝试匹配所有内容

您可以使用简单的正则表达式,

/^\{1:F01.*5:\{TNG:\}\}$/gm

Regex Demo

<小时/> 正则表达式解释

  • ^将正则表达式锚定在字符串的开头。

  • {1:F01.*在字符串的开头匹配{1:F01,后跟任何内容。

  • 5:\{TNG:\}\}匹配字符串末尾。

  • $将正则表达式锚定在字符串的末尾。

修改

在java中,使用Pattern.MULTILINE添加多行。如果您的输入字符串不是多行,则根本不需要添加此标志。

此外,正则表达式不需要由//分隔。

示例

String s="{1:F01[some data there]}{2:I515[some data there]}{4::[some data there]}{5:{TNG:}}";
Pattern p=Pattern.compile("^\\{1:F01.*5:\\{TNG:\\}\\}$", Pattern.MULTILINE); 
Matcher m=p.matcher(s);
System.out.println(m.matches());
// true

答案 1 :(得分:1)

.*贪婪,它会尽可能长时间匹配,并且可能会记录太多记录。

.*?会尽快停止。

这应该做:

\{1:.*?\{5:\{TNG:\}\}