[英]Java regex for matching various types of section headers
我正在尝试创建一个正则表达式(用于 Java)来匹配潜在的部分标题。 部分标题可以是罗马数字(最多 39)或“A.3.10”、“3.4”、“4”、“34.A”等。但它似乎只匹配罗马数字或者只是另一部分,即使我在正则表达式中使用了交替。 我正在通过https://regexr.com/进行测试。
这是我的正则表达式:
(\b(?:(?:X{0,3}(?:I[V|X]|V?I{0,3}))|(?:(?:[0-9]{1,2}|[A-Z])(?:\s?\.\s?(?:[0-9]{1,2}|[A-Z])){0,2}))\b)
每个部分(罗马数字与字母+数字)似乎本身都表现正确:
roman numeral:
(\bX{0,3}(?:I[V|X]|V?I{0,3})\b)
letter+digit:
(\b(?:[0-9]{1,2}|[A-Z])(?:\s?\.\s?(?:[0-9]{1,2}|[A-Z])){0,2}\b)
以下是一些应该匹配的测试用例:
Section A.3
Section A . 34
Section 3 . A
Section 1.2.5.6
Section 1.2.5
Section 1.2. 5
Section 1 . 2 . 5
Section III
Section XVI
Section IX
Section 3.B
Section 35.C
Section A.B.34
Section 3
Section 34
Section C
Section 34.35
Section A.3.C
Section 3.A.5
以下是一些不应该通过的:
A common phrase is this though..
Section AB.34
Section AB.5
Section CD
Section 345
有人可以告诉我我错过了什么吗?
我的要求最终与原始问题中的细节有所不同。 以下是我最终用于 2 个不同用例的 2 个正则表达式,以及它们通过的测试示例:
1) https://regex101.com/r/D9sQGz/2
(\b(?<!\w)(?:[0-9]{1,2}|[A-Z])(?:\s?\.\s?(?:[0-9]{1,2}|[A-Z])){0,2}\b(?<=\w))
2) https://regex101.com/r/v0NjW6/2
(\b(?<!\w)X{0,3}(?:I[VX]|V?I{0,3})\b(?<=\w)(?:\s?\.\s?(?:[0-9]{1,2}|[A-Z])){0,2}\b(?<=\w))
字母+数字的模式也匹配两个坏情况:
Section AB.34 -->
Section AB.<word boundary>34<word boundary>
尝试让各个正则表达式正确,然后再次测试!
像这样组合两个正则表达式应该没有问题(如您的代码中所做的那样):
(?:(?:regex1)|(?:regex2))
还可以考虑使用两个正则表达式并在 Java 代码中执行 or 操作。 对于以后必须阅读您的代码的人来说,这更容易理解。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.