0

我有一个输入字符串"hello, dflk 1234 12345678, wod-=0, 87654321",我想获取所有“单词”的列表,这些“单词”不对应于正则表达式模式"\d{8}"(连续八位数字)。

我研究了 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,"

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

4

3 回答 3

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,
于 2012-08-21T06:13:07.127 回答
0

我已经用空字符串替换了找到模式的源字符串,然后使用字符串拆分函数来获取模式以外的所有字符串

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

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

于 2012-08-21T06:26:07.680 回答
0

这可能是您要查找的正则表达式(请记住,将 \ 放入字符串时需要对其进行转义):

(?<!\s)(?!\d{8}(\s|$))\S+
于 2012-08-21T06:29:17.240 回答