我是编程的新手,对不起,如果这看起来微不足道:我有一个文本,我试图用正则表达式分成单个句子.用这个.split方法我搜索一个点后跟一个大写字母
"\. A-Z"
Run Code Online (Sandbox Code Playgroud)
但是,我需要通过以下方式优化此规则.:(点)可能不会以Abs或之前S.如果它后跟一个大写字母(A-Z),如果它是月份名称,它仍然不匹配,如January | February | March.
我尝试实施上半年,但即使这样也行不通.我的代码是:
"( (?<!Abs)\. A-Z) | (?<!S)\. A-Z) ) "
Run Code Online (Sandbox Code Playgroud)
hoc*_*chl 13
首先,我认为您可能想要替换空间\s+,或者\s它是否真的只是一个空格(您经常在英文文本中找到双空格).
第二,要匹配你必须使用的大写字母[A-Z],但A-Z不起作用(但记住可能还有其他大写字母而不是A-Z......).
另外,我想我知道为什么这不起作用.正则表达式引擎将尝试匹配,\. [A-Z]如果它不在Abs或之前S.问题是,如果它是由一个preceeded S,它不是由preceeded Abs,所以第一个模式匹配.如果它在前面Abs,则不在其前面S,因此第二个模式版本匹配.无论哪种方式,其中一种模式将匹配Abs,因此S是相互排斥的.
问题第一部分的模式可能是
(?<!Abs)(?<!S)(\. [A-Z])
Run Code Online (Sandbox Code Playgroud)
要么
(?<!Abs)(?<!S)(\.\s+[A-Z])
Run Code Online (Sandbox Code Playgroud)
(根据我的建议)
那是因为你必须要避免|,如果没有它,现在表达式不是在Abs之前,而是在S之前.如果两者都为真,则模式匹配器将继续扫描字符串并找到您的匹配项.
为了排除月份名称,我提出了这个正则表达式:
(?<!Abs)(?<!S)(\.\s+)(?!January|February|March)[A-Z]
Run Code Online (Sandbox Code Playgroud)
相同的论点适用于负向前瞻模式.
我在标题中添加了对问题的简短回答,因为它位于 Google 搜索结果的顶部:
拥有多个不同长度的负向后查找的方法是将它们链接在一起,如下所示:
"(?<!1)(?<!12)(?<!123)example"
这将匹配example 2exampleand3example但不匹配1example 12exampleor 123example。