2

我需要获取一个字符串并提取模式的每个实例,并且只提取模式。

String test = "This is a test string to experiment with regex by separating every instance of the word test and words that trail test";

所以现在模式必须找到单词test以及它前面和后面没有的任何单词test。所以基本上它必须导致找到这种模式的 3 个实例。

我期待的3个结果如下:

  1. This is a test string to experiment with regex by separating every instance of the word
  2. test and words that trail
  3. test

我在gskinner上玩过积极的前瞻和消极的前瞻,但还没有运气。

4

2 回答 2

4

试试这个

(\s*\b(?!test\b)[a-z]+\b\s*)*test(\s*\b(?!test\b)[a-z]+\b\s*?)*

在 Regexr 上查看。

在 Java 中,我会替换[a-z]\p{L},但 regexr 不支持 Unicode 属性。\p{L}带有属性 letter 的 Unicode 代码点,这将匹配任何语言的每个字母。

解释:

(\s*\b(?!test\b)[a-z]+\b\s*)*正在匹配一系列不是“测试”的单词。这是由否定的前瞻断言来保证的(?!test\b)

test匹配“测试”

最后再次相同:再次匹配一系列不是“测试”的单词(\s*\b(?!test\b)[a-z]+\b\s*?)*

于 2013-01-18T10:59:02.293 回答
0

为了跟进我的评论,我可以想象将您的测试字符串与模式分开\btest\b,然后将字符串部分左右连接

String parts[] = test.split("\btest\b", -1);
for (int i = 0; i < parts.length - 1; ++i)
    System.out.println(parts[i] + "test" + parts[i + 1]);
于 2013-01-19T14:48:04.557 回答