1

示例文本:在公园里,孩子们在玩耍。孩子个子高。孩子看着另一个孩子玩耍。

我想匹配第一句中的“child”,第二句和第三句中的“Child”,而不是第三句中的“child”。或者换句话说,匹配“Child”或“child”,但如果以“another”开头,则不匹配

我以为我可以用消极的眼神来做到这一点

 ((?<\!another) [Cc]hild)

但似乎无法使语法正确以生成有效的正则表达式。

即使我能得到正确的语法,我也不确定我能在 GWT 中做到这一点。这是来自 GWT Javadoc 的片段

正则表达式语法中特定于 Java 的构造(例如[a-z&&[^bc]], (?<=foo), \A, \Q),仅在纯 Java 实现中有效,在 GWT 实现中无效,...

任何帮助或见解将不胜感激。

更新:

科林的回答几乎有效,但并不完全正确。

Colin 的正则表达式确实匹配“孩子”和“孩子”,而不是像我问的那样匹配“另一个孩子”。不过也有一些问题。

我想要做的是匹配“孩子”和“孩子”,这样它们就可以替换为孩子的名字或正确的代词他/她,这取决于孩子的性别。

Colin 的正则表达式的问题在于它匹配“,child”和“.child”。如果那是文本中的第一个单词,它也不匹配“Child”。例如:

“孩子去了公园。在公园里,孩子在玩耍。孩子很高。孩子看着另一个孩子在玩耍。”

第一个 Child 不匹配。随后的匹配项是“, child”、“.child”和“.child”。

我研究了 Colin 想出的正则表达式,试图让它只匹配“child”或“Child”,但不能让它工作。

4

2 回答 2

1

GWT 中的正则表达式与 RegExp JavaScript 具有相同级别的支持,因为它只调用原生 JavaScript 类

鉴于 JavaScript 正则表达式不支持后视或所有格量词,我想不出直接在正则表达式中拒绝“另一个孩子”的方法。

因此,我将编写一个正则表达式,这样,如果“另一个”出现在“孩子”之前,那么“另一个”肯定会匹配;否则,只会匹配“child”。然后,您可以过滤掉超过 5 个字符的匹配项。

RegExp.compile("(?:another +)?[Cc]hild", "g")

请注意,字符串“some children”中的“child”也将被匹配。如果 "another" 被嵌入到一个较长的字符串中,例如 "ranother" 1,那么我们将盲目地拾取该片段。为了防止这种情况,我们需要添加单词边界检查\b2

RegExp.compile("(?:\\banother +)?\\b[Cc]hild\\b", "g")
                   ---           ---        ---
                    |             |          |
            prevent "ranother"  prevent "children"
              from matching        or "nochild"
                                  from matching

i您还可以允许使用标志进行不区分大小写的匹配(这对于文本来说是非常合理的) 。但是,我将由您决定。

使用上面的正则表达式,我们总是会在匹配“child”之前匹配“another child”。因此,当匹配只包含“child”时,我们知道“another”不在它之前。因此,我们可以过滤掉长度大于 5 的匹配项,只剩下有效的字符串。

脚注

  1. 我用一个虚构的词作为例子。在任意字符串中是完全正常的,但我不知道英语中是否有任何嵌入“another”的单词。

  2. 这里有一个警告。"child4" 或 "child_something" 使用时将不匹配\b。而“_another child”或“5another child”中的“another”不会被正则表达式拾取(并且只有“child”匹配,这意味着您接受匹配)。可以解决此问题,如果您要求,我会这样做。

于 2013-02-16T03:00:30.037 回答
-1

匹配“Child”或“child”,但如果以“another”开头则不匹配

([^(?:another)] [Cc]hild)

这将捕获一个不以another(使用非捕获组的否定字符集)开头的组,然后是空格,然后是单词child,大写与否。空间有要求吗?您在原始版本中拥有它,并且它出现在您的示例中的所有四个测试用例中。让这个稍微有用一点(你实际上想捕捉什么?),开始围绕孩子的唯一捕捉组:

[^(?:another)] ([Cc]hild)

在支持的浏览器正则表达式功能上使用 MDN 文档:https ://developer.mozilla.org/en-US/docs/JavaScript/Guide/Regular_Expressions

测试用例:

public void testHomeworkRegex() {
  String sample = "In the park, child plays. Child is tall. Child watches another child at play.";
  RegExp regex = RegExp.compile("[^(?:another)] ([Cc]hild)", "g");//using global flag to match multiple times

  MatchResult result1 = regex.exec(sample);
  assertNotNull(result1);
  assertEquals("child", result1.getGroup(1));

  MatchResult result2 = regex.exec(sample);
  assertNotNull(result2);
  assertEquals("Child", result2.getGroup(1));

  MatchResult result3 = regex.exec(sample);
  assertNotNull(result3);
  assertEquals("Child", result3.getGroup(1));


  MatchResult result4 = regex.exec(sample);
  assertNull(result4);
}
于 2013-02-15T23:53:46.757 回答