我试图匹配圣经中的任何一种形式的经文:
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当上面的匹配的-any空间可以出现在文本字符串中的任何地方时,应该忽略上面示例中的-any空间:
这是文本John 4:5 -1 John 4:6文本john 4-5
这是我所拥有的,但几乎不起作用,并且在一长串文本中与之不匹配:
\b[a-zA-Z]+(?:\s+\d+)?(?::\d+(?:–\d+)?(?:,\s*\d+(?:–\d+)?)*)?发布于 2014-03-07 16:08:49
这是尽可能具体的,在开头使用一个可选的大写字母,这样"jOhn“之类的东西就不匹配了。
(?:\d\s*)?[A-Z]?[a-z]+\s*\d+(?:[:-]\d+)?(?:\s*-\s*\d+)?(?::\d+|(?:\s*[A-Z]?[a-z]+\s*\d+:\d+))?发布于 2014-03-07 16:03:31
我们来分析一下你的格式。
首先,我看到的主要事情是“可以有一个破折号后面跟着一些东西”,所以让我们把这个问题分成两个部分:首先处理开始位,然后是可选的破折号和结束位。
您的第一个位集中在名称上,可能前面有一个数字。在它之后有一个数字,后面可能是一个冒号,然后是另一个数字。所以我们有:
(\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这取决于你有多虔诚,可以用各种丰富多彩的语言来描述。
但瑞吉斯什么时候长得漂亮了?
无论如何,在您的结果匹配中,您将拥有:
当然,其中任何一个都可以是空的,除了2和3。
发布于 2014-03-07 16:07:25
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
[:-]+https://stackoverflow.com/questions/22254746
复制相似问题