示例文本: 公园里, children 在玩耍。 child 个子很高。 child 看着另一个 child 玩耍。
我想在第一句中匹配“child”,在第二句和第三句中匹配“Child”,但在第三句中不匹配“child”。或者换句话说,匹配“Child”或“child”,但如果后面有“another”一词,则不匹配
我想我可以使用负向后看来做到这一点
((?<\!another) [Cc]hild)
但似乎无法获得正确的语法来生成有效的正则表达式。
即使我能得到正确的语法,我也不确定我能在 GWT 中做到这一点。以下是 GWT Javadoc 的片段
Java-specific constructs in the regular expression syntax (e.g.
[a-z&&[^bc]], (?<=foo), \A, \Q)
work only in the pure Java implementation, not the GWT implementation,...
任何帮助或见解将不胜感激。
更新:
科林的答案几乎有效,但并不完全正确。
科林的正则表达式确实匹配“Child”和“child”,而不像我问的那样匹配“另一个 child ”。但还是存在一些问题。
我想做的是匹配“Child”和“child”,这样它们就可以替换为 child 的名字或正确的代词他/她,具体取决于 child 的性别。
Colin 正则表达式的问题在于它匹配“,child”和“.Child”。如果“Child”是文本中的第一个单词,则它也不匹配。例如:
“ child 去了公园。在公园里, child 玩耍。 child 很高。 child 看着另一个 child 玩耍。”
第一个子项不匹配。随后的匹配位于“,child”、“.Child”和“.Child”。
我研究了 Colin 提出的正则表达式,试图让它只匹配“child”或“Child”,但无法使其工作。
最佳答案
GWT 中的正则表达式与 JavaScript RegExp 具有相同级别的支持,因为它只是 calls on to the native JavaScript classes .
考虑到 JavaScript 正则表达式不支持后视或所有格量词,我想不出直接在正则表达式中拒绝“另一个 child ”的方法。
因此,我会写一个正则表达式,这样,如果“another”出现在“child”之前,那么“another”肯定会被匹配;否则,只会匹配“child”。然后,您可以过滤掉超过 5 个字符的匹配项。
RegExp.compile("(?:another +)?[Cc]hild", "g")
请注意,字符串“somechildren”中的“child”也将被匹配。而如果“another”嵌入到一个较长的字符串中,例如“ranother”1,那么我们就会盲目地选取该片段。为了防止这种情况,我们需要添加字边界检查\b
2:
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的匹配项,只留下有效的字符串。
脚注
我用一个合成词作为例子。任意字符串都是正常的,但不知道英文里有没有嵌入“another”的单词。
这里有一个警告。使用
\b
时,“child4”或“child_something”将不匹配。而“_another child”或“5another child”中的“another”将不会被正则表达式选取(并且只有“child”被匹配,这意味着您接受匹配)。可以解决这个问题,如果您要求,我会这样做。
关于javascript - 无法让 RegExp 在 GWT 中匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14904984/