javascript中的可选前瞻

时间:2013-03-10 13:11:53

标签: javascript regex

我正在尝试为用户输入构建一个正则表达式。我根据用户输入构建表单。让我们假设用户为“Icon- [anything]”(Bootstrap Icon)指定了css属性。现在在这种情况下,我必须确保“ - ”不会重复多次,并且还应确保“icon-white”应该是另一个分配的唯一类;这个'icon-white'也必须是可选的。

/^icon-[a-z-]+(\ icon-white)?$/ 

- 这个正则表达式适用于OPTIONAL Icon-white Scenario,但在避免重复' - '方面有一些问题。

2 个答案:

答案 0 :(得分:1)

如果您想匹配“icon-somevalue”而不是“icon-some”,请尝试

icon-(?!white).*

答案 1 :(得分:1)

如果我理解正确(虽然我不确定,但抱歉......)我想你说的是允许以下两种情况:

  1. icon-white
  2. icon-[anything]其中[anything]可以是任何小写文字并包含连字符,但绝不会将两个(或更多)连字符直接放在彼此旁边,如--
  3. 你没有说这个模式可能出现在哪里虽然你的原始正则表达式表明这种模式会发生在测试字符串的开头,所以我会假设是这种情况。在这种情况下,这个正则表达式应该有所帮助:

    <强> ^icon-white$|^icon-([a-z]+-?)+$

    打破这一点:

    1. ^icon-white$匹配包含的文字字符串“icon-white”
    2. |
    3. ^icon-([a-z]+-?)+$开头的文字字符串与“icon-”完全匹配,然后立即以“某事物”([a-z]+-?)+结束。
    4. 现在,要清楚 - 我没有得到icon-whiteicon-[something]之间的关系。也就是说,据我所知,上面3中的icon-[something]模式也无法覆盖“icon-white”文字。即上面的1和2是多余的。但我把它们包括在这里,所以你可以把更合适的东西拼凑起来。

      从3开始打破“某事”:

      1. ( )+表示括号内的任何内容的一个或多个实例,即[a-z]+-?
      2. 打破[a-z]+-?

        1. [a-z]+至少有一个字符“a”到“z”(此处不允许使用连字号以避免在前一个字符后立即使用连字符)
        2. -?一个可选的连字符(即正好是0或1个连字符)

        3. 这符合以下测试用例:

          1. 图标白
          2. 图标-X
          3. 图标-XX
          4. 图标-X -
          5. 图标-XX -
          6. 图标-X-X
          7. 图标-XX-X
          8. 图标-XX-XX
          9. 图标-X-X-X -
          10. 图标-X-XX-XX-X-xxxxx- ......等等。
          11. 这与以下测试用例不符:

            1. 使用大写字母的任何情况(您只指定小写字母)
            2. icon-(因为我们需要一个或多个字符代表“某事”。
            3. 图标 -
            4. 图标 - X
            5. 图标-X -

            6. 我希望这能满足你的需求,但我对此表示怀疑(因为我并不真正理解你的解释)“确保”icon-white“应该是唯一一个分配给另一个人的课程”,但希望我的分解会给你你需要的东西。


              修改

              我想也许你说允许的场景是:

              1. icon- [东西]
              2. icon- [something] icon-white
              3. icon-white icon- [something]
              4. 其中[something]是小写文本和大写的任意组合,只要它不是双连字符,只要它不是“白色”。

                所以...这定义了“icon- [something]”:icon-(?!white$)([a-z]+-?)+

                这意味着我们上面的3个场景是:

                1. ^icon-(?!white$)([a-z]+-?)+$
                2. ^icon-(?!white$)([a-z]+-?)+ icon-white$
                3. ^icon-white icon-(?!white$)([a-z]+-?)+$
                4. 因此,将它们放在一起:

                  <强> ^icon-(?!white$)([a-z]+-?)+$|^icon-(?!white$)([a-z]+-?)+ icon-white$|^icon-white icon-(?!white$)([a-z]+-?)+$

                  我尝试使用icon-white部分作为可选组进行此操作,但是在捕获它的第一部分中出现负面预测时出现问题......所以......这样做; - )