我正在尝试匹配可能是以下任何格式的圣经经文:
1 John 4:5 - 6
2 john 4:5 - 4:6
3 john 4:5 - 3 John 4:6
John 4:5 - 6
john 4:5 - 4:6
John 4:5 - 1 John 4:6
1john4:6
john 4
john 4-5
1 john 4-5
- 匹配时应忽略上述示例中的任何空格 - 以上任何一种都可以出现在一串文字中:
text this is text John 4:5 - 1 John 4:6 text text john 4-5 more text
这就是我所拥有的但几乎没有工作,并且在一长串文本中没有正确匹配:
\b[a-zA-Z]+(?:\s+\d+)?(?::\d+(?:–\d+)?(?:,\s*\d+(?:–\d+)?)*)?
答案 0 :(得分:4)
让我们分解你的格式。
首先,我看到的主要内容是“可能存在短划线后跟东西”所以让我们将这个问题分成两部分:首先处理起始位,然后是可选的短划线和结束位。 / p>
您的第一位专注于名称,并且可能会有一个数字。在它之后有一个数字,后跟一个冒号,然后是另一个数字。所以我们有:
(\d*)\s*([a-z]+)\s*(\d+)(?::(\d+))?
现在是冲刺后的位。这是一个数字,后跟名称和另一个数字。然后整个事情可能会跟着一个冒号和另一个数字。请记住,整个事情是可选的:
(\s*-\s*(\d+)(?:\s*([a-z]+)\s*(\d+))?(?::(\d+))?)?
将两者放在一起并将其包装在一个不区分大小写的文字中,然后得到:
/(\d*)\s*([a-z]+)\s*(\d+)(?::(\d+))?(\s*-\s*(\d+)(?:\s*([a-z]+)\s*(\d+))?(?::(\d+))?)?/i
根据你的虔诚程度,可以用各种丰富多彩的语言来描述。
但是从那时起Regexes还不错吗?
无论如何,在你的结果匹配中,你将拥有:
当然,其中任何一个都可以为空,除了为2和3。
答案 1 :(得分:2)
这是具体的,可以使用像开头的可选大写字母这样的东西,所以像“jOhn”这样的东西不匹配。
(?:\d\s*)?[A-Z]?[a-z]+\s*\d+(?:[:-]\d+)?(?:\s*-\s*\d+)?(?::\d+|(?:\s*[A-Z]?[a-z]+\s*\d+:\d+))?
答案 2 :(得分:1)
FWIW我发现RegexPal在这些情况下是一个巨大的帮助。这就是我最终的结果:
([\d ]*[a-zA-Z]+( \d*:\d*)?)(( - )| )?(((\d* )?[a-zA-Z]+ )?\d*([:-]+\d*)?)
分解为:
// zero of more digit(s) or a space
[\d ]*
// any number of upper/lowercase letters
[a-zA-Z]+
// a space followed by an optional any number of digits, a colon,
// and any number of digits again
( \d*:\d*)?)
// an optional hyphen with a space either side, or a space.
(( - )| )
对可选连字符的另一面重复,除了这个区别:
// one or more of either a colon or a hyphen
[:-]+
答案 3 :(得分:1)
你可以试试这个:
/(?:\d+ ?)?[a-z]+ ?\d+(?:(?::\d+)?(?: ?- ?(?:\d+ [a-z]+ )?\d+(?::\d+)?)?)?/i