【问题标题】:Regex - find specific number in string正则表达式 - 在字符串中查找特定数字
【发布时间】:2013-08-27 14:17:48
【问题描述】:

我整天都在用正则表达式苦苦挣扎,找不到解决方案。 我试图在包含数字、分号、冒号和空格的字符串中找到一些特定的数字。

为了我们的目的,假设我正在寻找号码 1234

这里有几个应该匹配的例子(每一行都是不同的字符串):

1234
;1234;
1234 : 5678
;1234,3321

以及不应该匹配的示例(因为它是不同的数字):

;12345;
0123456

我目前的尝试:

[^(0-9*)]1234[^(0-9*)]

这里是我的问题的 Regex Tester 的永久链接: Regex Tester fiddle

【问题讨论】:

  • 您最终将在哪种语言或工具中使用该模式?另外,这不是字符类单词的方式,您正在寻找否定的lookarounds
  • [^(0-9*)] 表示不是数字(0-9)、括号(())或星号*。您可能只想使用[^0-9](不是数字)。
  • 我将在 MySQL 中使用它,在 WHERE 中使用 REGEX

标签: mysql regex


【解决方案1】:

也许试试这个:([^0-9]|^)1234([^0-9]|$) 在这种情况下,您不需要环视功能。

您可以使用它来更好地理解正则表达式。它有一个很好的 gui 来可视化模式。 Debuggex

【讨论】:

  • 请注意,这将无法匹配字符串开头或结尾的数字。
  • “1234”将被视为该集合的重复计数
  • 在某些实现中它会。并非所有人都使用 {n} 进行重复计数
  • @Jay:你有一个没有的例子吗?我见过的每个允许重复计数的正则表达式实现都使用{}\{\} 来分隔它们。
  • @Jay OP 的正则表达式测试器(ECMAScript)使用的那个没有。最流行的(基于 Perl 或基于 POSIX 的)也没有。不过,我会对反例非常感兴趣。
【解决方案2】:

如果您的风格支持lookahead and lookbehind,请使用:

(?<!\d)1234(?!\d)

环视测试是否出现不匹配的字符。负环视仅在没有发生时接受。

如果支持word boundaries:

\b1234\b

单词边界包括例如。空格和标点符号。

否则检查非数字字符并添加字符串开头和结尾:

(^|\D)1234($|\D)

如果您的引擎甚至不支持\d\D,请将它们分别替换为[0-9] [^0-9]

【讨论】:

  • 字符类中的 ^$ 只是文字字符。您需要使用其外部的锚点,如(?:^|\D)...(?:\D|$)
  • 是的,太快了——编辑了我的帖子,但省略了不匹配的组,因为这不是必需的,但会使查询更复杂。
  • 当然,没关系。我只是认为,即使它使模式变得混乱,它也是最重要的正则表达式习惯之一。因为确实知道普通括号确实捕获的人可能会混淆我们捕获的内容 - 所以我总是尽量明确并同时避免任何不必要的开销。
【解决方案3】:

这可能有效:

.*[^0-9]*[1][2][3][4][^0-9]*.*

它是如何工作的:

.*             anything
[^0-9]*        an optional character that is not a number
[1][2][3][4]   "1234" done this way because it will be taken as a repeat count unless escaped
[^0-9]*        an optional character that is not a number
.*             anything

以“1234”开头或结尾且没有其他字符的字符串可能存在问题。根据正则表达式的实现,可能不需要正面和背面的任何内容的匹配。

【讨论】:

  • 由于[^0-9] 是可选的,.* 可以匹配除1234 之外的所有内容(包括相邻的数字)。也没有必要把数字放在类中。
  • 除非转义,否则它们将被视为重复计数
  • 不,他们不会。那是{1234}
  • 不,他们不会。重复计数在{}
猜你喜欢
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-24
  • 1970-01-01
  • 2019-11-03
  • 2016-07-26
相关资源
最近更新 更多