正则表达式匹配给定输入字符串中的多个不同子字符串

时间:2013-12-17 20:01:23

标签: regex

我正在尝试编写一个正则表达式,它将匹配给定字符串中的多个子字符串。这是我的要求:

输入字符串:value(abc) or v(def) or s(xyz)

我的正则表达式应与value(v(匹配。

这就是我写的:^(?:value\(|v\()

但上述正则表达式与value( v(匹配,而不是两者都匹配。我需要正则表达式来匹配两者。有没有办法做到这一点?

此外,有没有可能的方法,我可以得到括号之间的子串?就像在上面的例子中选择abc或def的方法一样?

3 个答案:

答案 0 :(得分:2)

摆脱字符串开头anchor^):

(?:value\(|v\()

DEMO

答案 1 :(得分:2)

你的正则表达式以一个字符串开始锚点(^)开始。这会导致正则表达式仅在字符串的开头匹配。由于"v(def"不在输入字符串"value(abc) or v(def) or s(xyz)"的开头,因此正则表达式不匹配。删除字符串开始锚点将解决此问题。

此外,正则表达式中的两个替代方案大致相同,除了第一个替代方案中的一些其他字符。您的正则表达式可以简化为以下内容:

v(?:alue)?\(

Regular expression visualization

更新:要获取括号内表达式的值,您可以使用捕获组(使用()包围表达式)。捕获组根据其左括号的位置进行编号。 (首先出现的群组是“1”,第二个(是群组“2”,依此类推。根据您使用的正则表达式引擎,您也可以使用命名捕获组(?<name> ... )(我知道.NET支持它们)。然后,您将使用引擎的方法来检索捕获组的值。

例如,以下正则表达式将匹配:

  • vvalue
  • 开场(
  • 由字母字符组成的可选值
  • 结束)

可选值将存储在“值”捕获组中。您需要更改值组内的表达式以匹配值的格式。

v(?:alue)?\((?<value>[a-zA-Z]*)\)

Regular expression visualization

(使用Debuggex创建的可视化)

答案 2 :(得分:0)

要匹配字符串中括号之间的字符串内容,请使用带括号的子表达式捕获它:

(?:value\(|v\()([^)]*)\)

此模式匹配:

  • (?:value\(|v\() - 开场value(v(
  • ([^)]*) - 任意数量的字符)。将此部分放在括号中意味着匹配的任何内容都将保存在匹配组中。
  • \) - 最后的右括号

实际检索值的方法取决于您使用的语言;通常,正则表达式搜索函数返回某种匹配对象,它将提供一种方法来为您提供括号中的值。例如,在python中:

import re

str = 'value(abc) or v(def) or s(xyz)'
match = re.search(r'(?:value\(|v\()([^)]*)\)', str)
if match:
    print match.group(1)

将打印abc