28

我是正则表达式的新手,我正在尝试想出一些与下面的文本匹配的东西:

ABC: (z) 1999 年 1 月 2 日 \n

笔记:

  • 文本将始终以“ABC:”开头
  • ':' 和 (z) 之间可能有零个、一个或多个空格。
  • (z) 的变体也是可能的 - (zz)、(zzzzzz).. 等,但总是包含在“()”中的非数字字符
  • (z) 和 jan 之间可能有零个、一个或多个空格
  • jan 可以是 jan、january 等
  • date 可以是任何格式,并且可能/可能不包含其他文本,所以我真的很想知道是否有一个正则表达式可以用来捕获在 '(z)' 和 '\n 之间找到的任何内容'

任何帮助是极大的赞赏!谢谢

4

3 回答 3

47

以下应该有效:

ABC: *\([a-zA-Z]+\) *(.+)

解释:

ABC:            # match literal characters 'ABC:'
 *              # zero or more spaces
\([a-zA-Z]+\)   # one or more letters inside of parentheses
 *              # zero or more spaces
(.+)            # capture one or more of any character (except newlines)

要根据以下评论获得所需的分组,您可以使用以下内容:

(ABC:) *(\([a-zA-Z]+\).+)
于 2012-10-01T16:25:45.053 回答
4

在不知道您正在使用的确切正则表达式实现的情况下,我只能提供一般性建议。(我将使用 perl 的语法,因为这就是我所知道的,某些语言需要调整)

看着ABC: (z) jan 02 1999 \n

  • 首先要匹配的是 ABC:所以使用我们的正则表达式是/ABC:/

  • 您说 ABC 始终位于字符串的开头,因此/^ABC/将确保 ABC 位于字符串的开头。

  • \s您可以使用(注意大小写)指令匹配空格。对于所有指令,您可以将一个或多个与+(或 0 个或多个与*)匹配

  • 您需要避免使用(and)因为它是保留字符。所以\(\)

  • 您可以匹配任何非空格或换行符.

  • 你可以匹配任何东西,.*但你需要小心你不要太贪婪并捕获所有东西。

所以为了捕捉你所问的。我会用/^ABC:\s*\(.+?\)\s*(.+)$/

我读为:

以 ABC 开头:

可能有一些空格

有 (

有一些字符

有 )

可能有一些空格

然后捕获所有内容,直到行尾(即$)。

我强烈建议保留以下关于 http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/的内容的副本

于 2012-10-01T16:41:54.437 回答
1

这应该满足您的要求。

ABC:\s*(\(\D+\)\s*.*?)\\n

这是一些测试http://www.regexplanet.com/cookbook/ahJzfnJlZ2V4cGxhbmV0LWhyZHNyDgsSBlJlY2lwZRiEjiUM/index.html

进一步阅读正则表达式:http ://www.regular-expressions.info/characters.html

于 2012-10-01T16:28:50.297 回答