匹配字母后面没有数字的字符串

时间:2015-08-20 14:48:01

标签: php regex string

我的情况如下。我们的系统需要从作为查询参数传入的字符串中提取过滤器,但如果字符串格式不正确,也会抛出404错误。因此,让我们将以下三个字符串作为一个例子:

  1. pf0pt1000r
  2. pfasdfadf
  3. pf2000pt2100
  4. 根据应用程序要求,只有#3匹配为"有效"串。所以我当前的正则表达式匹配/([a-z]+)(\d+)/。但这也与#1匹配,如果不是完全匹配,但它仍然匹配。

    我的问题因此是双重的 - 我需要2个模式,1个匹配此列表中的第3个字符串,另一个匹配"不可接受的"字符串1和2.我相信必须有一些方法来否定"一个模式(所以我在技术上只需要一个模式,我假设),但我不确定如何做到这一点。

    感谢您的帮助!

    修改

    为了清楚起见,让我解释一下。 "过滤器参数"此处的结构采用以下结构 - 1或2个字母,后跟一些好的数字。这种结构可以重复多次。例如,有效的过滤字符串可以是

    • pf100pt2000
    • pf100pt2000r2wp0to1

    无效的字符串可能是

    • pf10000pt2000r
    • pf3000pt2123wpno
    • ......任何不符合上述结构的东西。

4 个答案:

答案 0 :(得分:4)

澄清问题后:

^([a-zA-Z]{1,2}\d+)*$

说明:

  1. [a-zA-Z] - 小写或大写字母
  2. {1,2} - 其中一两个
  3. \d+ - 一个或多个数字
  4. ()* - 整个事情重复了很多次
  5. ^$ - 将 start ^)中的整个字符串与 end $
  6. 匹配

答案 1 :(得分:2)

您可以将此正则表达式用于有效输入:

^([a-zA-Z]+\d+)+$

RegEx Demo 1

要查找无效输入,请使用:

^(?!([a-zA-Z]+\d+)+$).+$

RegEx Demo 2

答案 2 :(得分:1)

/^(?:(?:[a-z]+)(?:\d+))*$/

你是赫拉,男人。只需要一遍又一遍地重复这种模式直到结束。

*更改为+以拒绝空字符串。

哦,你有更具体的要求,试试这个:

/^(?:[a-z]{1,2}\d+)*$/

细分:

^       - Matches the start of the string an anchor
(?:     - start a non-capturing group
  [a-z] - A to Z.  This you already had.
  {1,2} - Repeat 1 or 2 times
  \d+   - a digit or more You had this, too.
)*      - Repeat that group ad nauseum
$       - Match the end of the string

答案 3 :(得分:0)

如果你只想要字符串末尾的数字,那么

/\d$/

会这样做。 \d = digit,$ =字符串结尾。