正则表达式(regex)。如何忽略或排除两者之间的一切?

时间:2018-10-08 02:40:34

标签: java regex

我有以下输入文字:

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);
            }      

3 个答案:

答案 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.])

Regex demo

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

Demo Java

答案 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个元素