为简单的字符串输入构造正则表达式

时间:2011-11-01 16:01:54

标签: regex

我是一个完全正念的新手。我正在尝试为带有连字符的字符串写一个正则表达式,后面跟着1到9之间的任何数字,然后是{mo,w,h,m,d}中的任何一个。我提出了:

-[1-9]+(mo)?|[h|w|d|m]

这并不是我想做的事。

对于ex:它匹配-2wh,它不应该。我做错了什么?

5 个答案:

答案 0 :(得分:2)

你几乎做对了..只是一个小小的改变:

- ([1-9] +)(MO | [hwdm])

如果你想限制字符串,你必须添加它(

^ - ([1-9] +)(MO | [hwdm])$

另请注意-10h不会起作用,因为你排除了零..如果你想包括它但不是因为第一个数字就像这样容易:

^ - ([1-9] [0-9] *)(MO | [hwdm])$

答案 1 :(得分:1)

您可以使用:

-[1-9]+(mo|[hwdm])

答案 2 :(得分:0)

这是正确的正则表达式的更正版本:

^-[1-9]+((mo)|[hwdm])?$
  • 您忘记了^(字符串的开头)和$(字符串的结尾)符号。这就是为什么你的正则表达式接受-2wh字符串(包含匹配的有效-2w字符串)的原因。
  • 我用[{1}}
  • 替换(mo)?|[h|w|d|m],稍微重构了你的正则表达式
  • 如果您不想包含仅包含数字的字符串(例如((mo)|[hwdm])?-2),请从此正则表达式中删除-8
  • 如果您想包含任意数字(包括零),请将?替换为[1-9]+

答案 3 :(得分:0)

你忘了锚定表达式。它验证很好,但在你验证之前和之后都可以有任何东西:

  • ^锚意味着“行首”
  • $锚意味着“行尾”

因此,根据此验证您的输入应该有效:

^-[1-9](mo?)|[hwd]$

请注意,在括号内,您不需要管道(|)来分隔字符。 [hwd]h|w|d相同。

答案 4 :(得分:0)

我认为这样做,它不会捕获不必要的组:

^-[1-9](?:mo|w|h|m|d)$

如果要捕获1到9之间的更多数字,请使用[1-9]+。如果您只想匹配数字,请使用\d+

HTH