Javascript 圣经经文Regex

Javascript 圣经经文Regex,javascript,regex,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 -匹配时,应忽略上述示例中的任何空格 -上述任何内容都可以出现在文本字符串中的任意位置: \b[a-zA-Z]+(?:\s+\d+)?(?::\d+(?:–\d+)?(

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

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
-匹配时,应忽略上述示例中的任何空格 -上述任何内容都可以出现在文本字符串中的任意位置:

\b[a-zA-Z]+(?:\s+\d+)?(?::\d+(?:–\d+)?(?:,\s*\d+(?:–\d+)?)*)?
课文这是课文约翰4:5-1约翰4:6课文约翰4-5更多课文

这是我所拥有的,但在一长串文本中几乎不起作用,也不正确匹配:

\b[a-zA-Z]+(?:\s+\d+)?(?::\d+(?:–\d+)?(?:,\s*\d+(?:–\d+)?)*)?

让我们把你的格式分解一下

首先,我看到的主要问题是“后面可以有一个破折号,后面跟着东西”,所以让我们把这个问题分成两部分:首先处理开始位,然后是可选的破折号和结束位

您的第一位集中在名称周围,前面可能有一个数字。后面是一个数字,后面可能跟一个冒号,然后是另一个数字。因此,我们:

(\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之外,其中任何一个都可以是空的。

    FWIW我发现这对这些情况有很大帮助。以下是我最终得到的结果:

    ([\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
    [:-]+
    

    这是尽可能具体的,在开始时使用诸如可选大写字母之类的内容,这样“jOhn”之类的内容就不匹配了

    (?:\d\s*)?[A-Z]?[a-z]+\s*\d+(?:[:-]\d+)?(?:\s*-\s*\d+)?(?::\d+|(?:\s*[A-Z]?[a-z]+\s*\d+:\d+))?
    
    您可以尝试以下方法:

    /(?:\d+ ?)?[a-z]+ ?\d+(?:(?::\d+)?(?: ?- ?(?:\d+ [a-z]+ )?\d+(?::\d+)?)?)?/i
    

    它与什么匹配,因为它“几乎不起作用”?什么不相配?它应该匹配什么,不应该匹配什么?那么一个正则表达式来匹配一个不规则的模式?祝你好运写一些整理你的数据的东西可能是最好的开始,让你的应用程序代码看到数据是没有意义的,直到它是好的和整洁的。我正在考虑与约翰会面4:10-4:15-你认为呢-D将此内容拖到我提到的网站中并不是所有内容都匹配。匹配
    John
    John
    (这是脚本kIdDiE bIbLe的一部分)怎么样?缺少一个
    可选标志。如果第一个书名以数字开头,则后面的所有内容也将匹配
    文本1john3:16-1john3:2
    ,而不是
    1john3:16-1john3:2
    需要字符串的实际示例,但匹配不正确。
    gfgfg 1john3:16-1john3:2 FDGJKDFNH john3:16-5 FKN gkm
    问题您希望匹配太多的格式,但它们相互冲突,因为您试图使用正则表达式来匹配接近不规则模式的内容。除非缩小模式匹配范围,否则很可能无法解决此问题。通常,可选的子表达式可能会导致回溯问题。在这个
    (\d*?)?
    中,整个事情已经是可选的,至少有一个内部项目应该是非可选的,这会导致浮动锚点抑制指数回溯。