Why does this regex not work? Maybe because of double lookbehinds?
我有这个regex:(?它把一个段落分成句子(基于每个空格)。
我在这段话中用过:Did he know that J. Smith is a name? The term is most commonly applied to the placing of a warship in active duty with its country's military forces. The ceremonies involved are Often rooted in centuries old naval tradition. I.D. is a wonderful word.。
它打断了"J.Smith",因为它认为"."代表句子的结尾。
我使用re.split()并打印出数组,用换行符分隔值
这是以上段落的输出:
1 2 3 4 5 6
| Did he know that J.
Smith is a name?
The term is most commonly applied to the placing of a warship in active duty with its
country's military forces. (no newline at beginning of sentence)
The ceremonies involved are Often rooted in centuries old naval tradition.
I.D. is a wonderful word.` |
它适用于"身份证",但为什么不适用于"J.史密斯"?从逻辑上讲,它应该…
我希望它在字符串中检测这个结构:
无大写字母+句点/?!+空白+大写字母
- regex如何区分Did he know that J. Smith is a name?和He knows more than I. Smith is a name.?我不认为只有regex才有可能。
lookback(或lookahead)是一个零宽度断言,也就是说,它在断言为真的任何点匹配零长度字符串。
特别是,这意味着,如果在regexp中有两个连续的lookbehind(或lookahead)断言,那么只有当它们在同一点上匹配时,它们才会匹配。
因此,如果前一个字符不是A-Z范围内的大写字母,并且是.!?字符之一,则(?匹配。显然,后一个断言意味着前一个,所以regexp的(?部分没有实际效果。
你想断言的是,前面的字符是.!?的,前面的字符不是大写字母。如果是这样,一种解决方案是用(?替换(?。
另外,您的原始regex没有拆分"I.D. is"的原因是,\s匹配的第一个点后没有空格,第二个周期后的空格后面没有您的前瞻性声明所要求的大写字母。
- 我试着用这个regex:(?<=(?来对"dr."做同样的操作,但它不起作用。我想是因为我做了(?<!(a-z)可选(使用?)所以它不能拆分"J.Smith"和"Muhammed博士"
- 是的,可选的lookback/ahead断言是完全无用的。相反,您可以使用例如(?。(但是,请注意,在有效的句子"EDOCX1"〔8〕之后,这也将不匹配,因为它无法将其与"EDOCX1"〔9〕区分开来,因此您可能希望使用更具体的断言,如(?。
除了@unutbu的观点外,它可能不会像你所期望的那样做,因为你在断言两个lookbehind在同一个字符上,也就是说,"前一个字符不是[A-Z],它是[.!?]。"也许你的意思是嵌套它们,例如。
1
| (?<=(?<![A-Z])[.!?])\s(?=[A-Z]) |
- 我要怎样筑巢?我想查一下"医生",但这不管用:(?<=(?。
- 我让EDOCX1[1]成为可选的,所以它仍然(理论上)适用于"j"和"dr"。
- 阅读@ilmarikorenen的答案。你仍然错误地认为后面的人有宽度,而实际上他们没有宽度。例如,您的意思是(?<=(?。但是,这不起作用,因为有一个单独的原因:lookbehind断言只能有一个固定的总宽度,而lookbehind断言中的可选性违反了这一点;此外,量化lookaround断言(我在某处读到)是未定义的行为。
- 没关系,我的逻辑有问题
- 在Java中,如果将EDCOX1×3的量词应用到查找表中,它会有效地忽略量词;如果查找表成功一次,它就不会再试一次,因为这将导致无限循环:在同一点上进行相同的断言,即无穷大。如果将?或*应用于环视,它实际上会忽略环视;同样,环视仅应用一次,但现在您甚至不在乎它是否成功。所以行为是被定义的,但是没有意义。大多数其他风格都将其视为语法错误,我认为这更有帮助。
- @阿兰摩尔-啊,很有趣。(你是如何认识到这些具体知识的?)我想,虽然"未定义",我的意思是,没有标准或约定的意义,而不是Java会做一些随机的事情。php会发出警告,但我认为javascript实际上做了一些奇怪的事情。自从我遇到它已经有一段时间了。