圣经诗歌正则表达

时间:2014-03-07 15:55:10

标签: javascript regex

我正在尝试匹配可能是以下任何格式的圣经经文:

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+)?)*)?

4 个答案:

答案 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还不错吗?

无论如何,在你的结果匹配中,你将拥有:

  1. 初始号码
  2. 名称
  3. 第二个号码
  4. 冒号后的数字
  5. 破折号后面的数字
  6. 第二个名字
  7. 名称后面的数字
  8. 第二次冒号后的最终号码
  9. 当然,其中任何一个都可以为空,除了为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