正则表达式:匹配除8位数序列之外的所有单词

时间:2012-08-21 06:09:54

标签: java regex

我有一个像"hello, dflk 1234 12345678, wod-=0, 87654321"这样的输入字符串,我希望获得所有“单词”的列表,这些单词与正则表达式模式"\d{8}"不对应(连续八位)。 / p>

我研究过java.util.regex api doc,但是我无法找到一种方法将否定正则表达式“\ d {8}”放在一起。这是我想用它的方式:

String input = "hello, dflk 1234 12345678, wod-=0, 87654321";
List<String> hitList = new ArrayList<>();
Pattern p = Pattern.compile(...?...); //<- how to define the regex pattern?
Matcher m = p.matcher(input);
while(m.find()) {
    hitList.add(m.group());
}

我想在我的hitList中拥有所有这些(基于上面的输入字符串):

"hello,"  "dflk"  "1234"  ","  "wod-=0,"

你能建议一种定义正则表达式模式的方法吗?

3 个答案:

答案 0 :(得分:0)

一种方式(可能是最简单的方法)是过滤生成的匹配列表。

另一个是消极的前瞻和更多的外观:

(?<=^|\s|\d{8})(?!\d{8})\S+(?=$|\s|\d{8})

我认为,漂亮是不同的。

快速PowerShell测试:

PS Home:\> [regex]::Matches('hello, dflk 1234 12345678, wod-=0, 87654321', '(?<=^|\s|\d{8})(?!\d{8})\S+(?=$|\s|\d{8})')|
select -exp Value
hello,
dflk
1234
,
wod-=0,

答案 1 :(得分:0)

我已经使用替换了你的源字符串,其中找到了带有空字符串的模式,然后使用String split函数来获取除模式之外的所有字符串

String test = "hello, dflk 1234 12345678, wod-=0, 87654321";
            test = test.replaceAll("\\d{8}", "");
            String result[] = test.split("\\ ");
            for (String value : result) {
                System.out.println(value);
            }
        }

我已经测试了上述解决方案 希望这对你有所帮助。

答案 2 :(得分:0)

这可能是你正在寻找的正则表达式(请记住,当你把它放在一个字符串中时你需要转义\):

(?<!\s)(?!\d{8}(\s|$))\S+