【问题标题】:Regular expression only 2 consecutive specific characters正则表达式只有 2 个连续的特定字符
【发布时间】:2016-06-03 21:06:15
【问题描述】:

我正在尝试为抽象文件系统构建正则表达式。它应该:

  • 以字母 [a-zA-Z]、'/' 或 '.' 开头
  • 只允许连续出现一次“/”
  • 只允许连续出现两次 '.'

这是我到目前为止所拥有的(不允许使用 3 '.',但只输入一个时可以使用。非常感谢任何输入。我尝试了第二组的正负前瞻,但它仍然有同样的问题。

(?!.*\/{2})(?!.*\.{3})^[A-Za-z\/\.]*$

我的 Regex101 链接:

https://regex101.com/r/xM8oY5/1

【问题讨论】:

  • 为什么你试图用一个单一的正则表达式来表达所有的条件,而不是为每个规则构建一个正则表达式?在单独的测试中禁止/^[^/.a-z]/i/[/]{2,}//[.]{3,}/ 怎么样?
  • 好建议!我可以根据需要在 php 中多次执行 preg_match()。我没有想到。谢谢

标签: regex abstraction


【解决方案1】:

我添加了一个否定的前瞻,它匹配一个被两个非点字符包围的点 .

/(?!(.*[^.])?\.([^.].*)?$)(?!.*\/{2})(?!.*\.{3})^[A-Za-z\/\.]*$/
 ^^^^^^^^^^^^^^^^^^^^^^^^^
    (.*[^.])?              -> some arbitrary characters and at least one not-dot
             \.            -> the dot
               ([^.].*)?$  -> one not-dot and some arbitrary characters

如果单个点出现在字符串的开头或结尾,则两个块(点之前和之后)都是可选的。

regex101 上测试它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多