我有以下输入文字:
142d 000781fe0000326f BPD false 65535 FSK_75 FSK_75 -51.984 -48
我想使用正则表达式提取000781fe0000326f和-51.984,所以输出看起来像这样
000781fe0000326f-51.984
我可以使用[0-9]{5,7}(?:[a-z][a-z0-9_]*)
和([-]?\\d*\\.\\d+)(?![-+0-9\\.])
分别提取000781fe0000326f
和-51.984
。
有没有办法忽略或排除000781fe0000326f
和-51.984
之间的所有内容?要忽略非贪婪填充符(。*?)将捕获的所有内容?
String ref="[0-9]{5,7}(?:[a-z][a-z0-9_]*)_____([-]?\\d*\\.\\d+)(?![-+0-9\\.])";
Pattern p = Pattern.compile(ref,Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
Matcher m = p.matcher(input);
while (m.find())
{
String all = m.group();
//list3.add(all);
}
答案 0 :(得分:1)
对于示例数据,您可以使用alternation |
来匹配问题中的任一正则表达式,然后将它们连接起来。
请注意,在正则表达式中,您可以将(?:[a-z][a-z0-9_]*)
写为[a-z][a-z0-9_]
,而不必在字符类中转义点。
例如:
[0-9]{5,7}[a-z][a-z0-9_]*|-?\d*\.\d+(?![-+0-9.])
String regex = "[0-9]{5,7}[a-z][a-z0-9_]*|-?\\d*\\.\\d+(?![-+0-9.])";
String string = "142d 000781fe0000326f BPD false 65535 FSK_75 FSK_75 -51.984 -48";
Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
Matcher matcher = pattern.matcher(string);
String result = "";
while (matcher.find()) {
result += matcher.group(0);
}
System.out.println(result); // 000781fe0000326f-51.984
答案 1 :(得分:0)
无法像纯正则表达式中那样将字符串组合在一起,但是很容易为第一个匹配创建一个组,为第二个匹配创建一个组,然后使用m.group(1) + m.group(2)
将两个组连接在一起并创建所需的组合字符串。
还请注意,[0-9]
简化为\d
,其中仅包含一个令牌的字符集也简化为该令牌,带有[a-z0-9_]
标志的i
简化为{ {1}},并且无需在字符集中转义\w
:
.
答案 2 :(得分:0)
您不能真正忽略中间的单词。您可以全部包含它们。 这样的东西将包括所有这些。
[0-9] {5,7}(?:[az] [a-z0-9 _] )[a-zA-Z0-9_] ([-]?\ d *。\ d +)(?![-+ 0-9。])
但这不是您想要的。 我认为最好的选择是要么具有2个正则表达式,然后合并结果,要么将字符串拆分为空格/制表符,并根据需要检查第n个元素