1

我正在尝试使用正则表达式匹配一个字符串,并且我非常接近让它以我想要的方式工作。

假设我有一个字符串 5A(test1),4B,3C(test2)

我做的第一件事是用逗号将字符串分开,所以我最终得到了一个数组中的 3 个字符串

  • 5A(测试1)
  • 4B
  • 3C(测试2)

现在我想提取以下信息;括号中的数字、字母和内容。但括号是可选的。

这是我的模式 ([1-9][0-9]*)([AaBbCcIiFfPpSs]+)(\(.*\))?

除了包含括号外,这有效。所以 当我想要的是 5 A test1时,我得到
5 A (test1)


我也试过 ([1-9][0-9]*)([AaBbCcIiFfPpSs]+)\(([^)]*)\)?
但是这在没有括号的字符串上不匹配,所以
5A(test1) 和 3C(test2) 匹配但 4B 不匹配。

任何援助将不胜感激。

4

2 回答 2

1

稍微改变一下你的正则表达式:

([1-9][0-9]*)([AaBbCcIiFfPpSs]+)(\((.*)\))?

里面的内容()将在捕获组 4 中。

如果您的语言支持非捕获组(?:pattern)

([1-9][0-9]*)([AaBbCcIiFfPpSs]+)(?:\((.*)\))?

这将防止不必要的捕获(节省一些内存),并且里面的内容()将在捕获组 3 中。

于 2013-03-01T17:00:40.137 回答
1

您需要一个额外的非捕获组围绕可选的最后一部分

([1-9][0-9]*)([AaBbCcIiFfPpSs]+)(?:\(([^)]*)\))?

在 Regexr 上查看

于 2013-03-01T17:00:21.770 回答