使用PHP正则表达式匹配标题中丑陋的额外缩写和数字

时间:2011-10-19 08:22:51

标签: php regex

我必须创建正则表达式以匹配丑陋的缩写和数字。这些可以是以下“格式”之一:

1) [any alphabet char length of 1 char][0-9]
2) [double][whitespace][2-3 length of any alphabet char]

我试图匹配double:

preg_match("/^-?(?:\d+|\d*\.\d+)$/", $source, $matches);

但是我还没有选择以下示例: 1.1 AA我的测试题目。我的正则表达式有什么问题,我怎样才能将其他正则表达到我的正则表达式?

2 个答案:

答案 0 :(得分:1)

在你的正则表达式中,你说“字符串的开头,后跟可能是a - 后跟至少一个数字或后跟0或更多数字,后跟一个点,后跟至少一个数字,然后是字符串的结尾。

所以你的正则表达式可以匹配例如.. 4.5, -.1等。这正是你告诉它的。

你测试输入字符串不匹配,因为在数字1.1之后还有其他字符存在,即使它以某种方式神奇地匹配你的“双”匹配正则表达式是错误的。

对于没有科学记数法的双人,你通常使用这个正则表达式:

[-+]?\b[0-9]+(\.[0-9]+)?\b

既然我们已经解决了这个问题,那么我们需要一个空格和

[2-3 length of alphabet] 

现在我不知道[2-3长度的字母]意味着什么,但通过结合上面你得到这样的正则表达式:

[-+]?\b[0-9]+(\.[0-9]+)?\b\s[2-3 length of alphabet]

如果您希望字符串完全匹配,您还可以放置锚点^ $:

^[-+]?\b[0-9]+(\.[0-9]+)?\b\s[2-3 length of alphabet]$

随时问你是否被卡住了! :)

答案 1 :(得分:0)

我发现你的正则表达式存在多个问题:

  1. 您尝试将锚点整个字符串(作为数字)匹配:^位于开头,$位于结尾处。如果您不想这样,请删除它们。
  2. 号码组无法捕捉。将检查匹配项,但不会将其添加到$matches。这是因为您在?:中设置的(?:...)内部选项。删除?:以使该群体捕获。
  3. 您将较短的数字图案放在较长的数字图案之前。如果您交换订单,正则表达式引擎将首先查找它,并且成功时优先于较短的订单。
  4. 也许这已经解决了你的问题:

    preg_match("/-?(\d*\.\d+|\d+)/", $source, $matches);
    

    Demo