正则表达式匹配任意长度的数字字符串,其前面可能有也可能没有前面的0x

时间:2009-04-01 12:12:04

标签: regex

我想知道你是否可以帮助我制定一个正则表达式来匹配以下模式?

任意长度的数字字符串,可能在也可能不在0x之前。

9 个答案:

答案 0 :(得分:7)

这样的事情:

\b(?:0x)?\d+\b

或者,如果您要从匹配项中排除可选的"0x"

(?:(?<=\b0x)|\b)\d+\b

前者是:

- a word boundary
- "0x", optional
- decimal digits, at least one
- a word boundary

后者将是:

- choose
  - either a position preceded by
     - a word boundary
     - "0x"
  - or a word boundary
- decimal digits, at least one
- a word boundary

后者匹配:

- 123456
- 0x123456

但不是:

- 0y123456

要匹配十六进制数字(如“0x”所示),请使用[0-9A-Fa-f]代替"\d"

答案 1 :(得分:2)

你能指出更多的问题吗?你想怎么用这场比赛?哪种语言/正则表达式实现。

一个可以使用许多语言regexp实现的简单方法是。

(?:0x)?\d+

答案 2 :(得分:2)

如果你想要整个字符串匹配(除了数字之外别无其他):

^(0x)?[0-9]+$

我在这里使用类[0-9]尽可能便携。您可能更愿意在任何地方使用\d

它的工作原理如下:

  • 匹配字符串的开头:^
  • 匹配可选的“0x”:(0x)?
  • 匹配一个或多个数字:[0-9]+
  • 匹配字符串的结尾:$

如果前面的“0x”表示十六进制数,则更难,而省略表示十进制数:

\b((0x[0-9a-zA-Z]+)|([1-9][0-9]*))\b

这也可以防止以0 ...

开头的十进制数字

答案 3 :(得分:1)

正式正则表达式:

(0x)?[0-9]+

答案 4 :(得分:1)

我总是喜欢提供非常基线的RE,因此它们可以在每个RE引擎上工作,所以:

(0x)?[0-9][0-9]*

有了合适的边界条件(在旧的RE引擎上,那将是[ \t]),这应该适用于任何地方。

但是,如果0x是正确的,看起来你想要的是十六进制字符,那么也许你想要:

(0x)?[0-9A-Fa-f][0-9A-Fa-f]*

或者它与许多其他针对更高级引擎的优秀建议相同。

答案 5 :(得分:0)

您提到的0x表示您想要捕获十六进制数字。在那种情况下,我建议:

(?:0x)?[[:xdigit:]]+

其中[:xdigit:]是Posix表示法中所有十六进制数的列表。

答案 6 :(得分:0)

这完全取决于您对数字的含义,以及允许数字的上下文。我假设前面带有0x的数字是十六进制数,因此也可以包含A-F和a-f。

鉴于此测试字符串:"a 012 0xa 4_56 num:8 42!"

此正则表达式与"012""0xa""4""56""8""42"匹配:

(0x[\dA-Fa-f]+|\d+)

此正则表达式与"012""0xa""8""42"匹配:

\b(0x[\dA-Fa-f]+|\d+)\b

此正则表达式与"0xa""8""42"匹配:

\b(0x[\dA-Fa-f]+|[1-9]\d*)\b

此正则表达式与"012""0xa"匹配:

(?<=\s)(0x[\dA-Fa-f]+|\d+)(?=\s)

此常规展示匹配"0xa"

(?<=\s)(0x[\dA-Fa-f]+|[1-9]\d*)(?=\s)

答案 7 :(得分:-2)

\ B((0X [[:xdigit:]] +)|((0 |([1-9] [0-9] +)))\ B'/ P>

答案 8 :(得分:-3)

['0x']?[0-9]+

  

这是更多文字,以满足最少30个字符。