无法使RegExp在GWT中匹配

时间:2013-02-15 23:19:23

标签: javascript regex gwt negative-lookbehind

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

我希望在第一句中匹配“child”,在第二句和第三句中匹配“Child”,而在第三句中不匹配“child”。或换句话说,匹配“儿童”或“儿童”,但如果单词“另一个”

,则不匹配

我以为我可以使用背后的负面看法来做到这一点

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

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

即使我能正确使用语法,我也不确定我能否在GWT中完成。以下是GWT Javadoc的片段

  

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

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

更新

科林的答案几乎有效,但不太对。

科林的正则表达式与“儿童”和“孩子”匹配,而不像我问的那样匹配“另一个孩子”。但是有一些问题。

我想要做的是匹配“孩子”和“孩子”,这样他们就可以用孩子的名字或正确的代名词取代孩子的性别。

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

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

第一个孩子不匹配。随后的比赛是“,孩子”,“。孩子”和“。孩子”。

我研究了科林试图让它与“孩子”或“孩子”相匹配的正则表达式,但却无法使其发挥作用。

2 个答案:

答案 0 :(得分:1)

GWT中的正则表达式与RegExp JavaScript具有相同的支持级别,因为它只是calls on to the native JavaScript classes

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

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

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

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

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

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

使用上面的正则表达式,我们将在匹配“child”之前始终匹配“另一个孩子”。因此,当匹配仅包含“子”时,我们知道“另一个”确实不在其前面。因此,我们可以过滤掉长度> 1的匹配项。 5,我们只留下有效的字符串。

<强>脚注

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

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

答案 1 :(得分:-1)

  

匹配&#34;儿童&#34;或者&#34;孩子&#34;但如果以“#34;另一个&#34;

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

这会捕获一个不以another开头的组(使用非捕获组的否定字符集),然后是空格,然后是单词child,大写与否。空间是必需的吗?你有它的原始版本,它存在于你的例子中的所有四个测试用例中。使这个稍微有用(你实际上想要捕获什么?),启动围绕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);
}