我将内容作为字符串:
{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:\}\})?
但我总是得到包含每条记录的全部内容。 怎么办?
答案 0 :(得分:1)
正则表达式匹配每个类似因素,因为{1
和{5
可选?
,而.*
会尝试匹配所有内容
您可以使用简单的正则表达式,
/^\{1:F01.*5:\{TNG:\}\}$/gm
<小时/>
正则表达式解释
^
将正则表达式锚定在字符串的开头。
{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:\}\}