【问题标题】:Regex to validate following types of Patterns正则表达式验证以下类型的模式
【发布时间】:2015-12-24 14:46:07
【问题描述】:

我是 Regex 的新手,目前正在用 PHP 开发一个网站。就我所学的正则表达式而言,我创建了以下正则表达式模式来匹配值。我创建了 2 个正则表达式来验证我的输入。

1) 第一个,我想创建一个正则表达式,它可以允许可选的子字符串not

456,88,not,398     //True
not,934,3094,not   //true
not,389,383        //True
394,588,not        //True
694,20,589         //True
493                //True
not                //True
344,not,           //False
,not               //False

我创建了以下正则表达式

/^\d*(,?not,?)*(,\d+)*$/

但这失败了

not,934,3094,not    //<--Fails
389,not,            //<--It returns true while I want it false
,not,               //<--It returns true while it should be false

对于上述要求,什么是好的正则表达式?


2) 第二个,我创建了一个正则表达式来验证以下字符串

983,9,4|499,5,3|123,8,8    //true
983,9,4                    //true

我的正则表达式在第一个上运行良好,但在第二个上却失败了

/^(((\d+,)*\d+)\|((\d+,)*\d+))*$/

【问题讨论】:

  • 你的正则表达式只允许一个not
  • 我不认为正则表达式是最好的方法。使用explode() 以逗号分隔字符串,然后查看该数组的元素是否符合您的规则。
  • @Barmar 是的,而且我提到的许多其他字符串也失败了
  • @Barmar 可能是,但随后我将不得不分解并循环遍历每个数组项并检查它是否正常。

标签: php regex string


【解决方案1】:

首先,使用这个正则表达式:

/^(\d+|not)(,(\d+|not))*$/

DEMO

对于第二个,您可以使用正则表达式。您需要使| 成为重复组的一部分。

/^(\d+,)*\d+(\|(\d+,)*\d+)*$/

DEMO

这两种方法都使用相同的通用方法。首先,您创建一个表达式 X 匹配序列中的一个元素。要允许它们中的多个由分隔符 D 分隔,请使用以下形式:

^X(DX)*$

【讨论】:

  • 是的,我认为这可能很好,但让我与正则表达式相比对其进行一些基准测试,因为我将有很多字符串。但我必须等到有人建议一个正则表达式,这样我才能比较两者
  • 我改变主意了,第一个有一个简单的正则表达式。
  • 是的,我明白了。谢谢巴尔玛。这是很好的捕获^X(DX)*$。我也很高兴我快到了。非常感谢。你的两个正则表达式都很有魅力,
【解决方案2】:

你想在结果中看到什么,只有在你的 1 正则表达式中没有的字符串? 第二个,试试这个:

/^(((\d+,)*\d+)[\|]?)+$/

这样更好:

((?:\d+,?)+[|]?)?+

【讨论】:

  • 我已经用示例定义了第一个所需的输出字符串
  • 这将允许 983,9,4|。它失败了
  • 您的“更好”版本仍然允许| 在字符串末尾。
  • 它还允许在管道之前使用逗号,例如 939,9,|
猜你喜欢
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多