我正在尝试编写一个正则表达式,它将匹配给定字符串中的多个子字符串。这是我的要求:
输入字符串:value(abc) or v(def) or s(xyz)
我的正则表达式应与value(
和v(
匹配。
这就是我写的:^(?:value\(|v\()
但上述正则表达式与value(
或 v(
匹配,而不是两者都匹配。我需要正则表达式来匹配两者。有没有办法做到这一点?
此外,有没有可能的方法,我可以得到括号之间的子串?就像在上面的例子中选择abc或def的方法一样?
答案 0 :(得分:2)
答案 1 :(得分:2)
你的正则表达式以一个字符串开始锚点(^
)开始。这会导致正则表达式仅在字符串的开头匹配。由于"v(def"
不在输入字符串"value(abc) or v(def) or s(xyz)"
的开头,因此正则表达式不匹配。删除字符串开始锚点将解决此问题。
此外,正则表达式中的两个替代方案大致相同,除了第一个替代方案中的一些其他字符。您的正则表达式可以简化为以下内容:
v(?:alue)?\(
更新:要获取括号内表达式的值,您可以使用捕获组(使用()
包围表达式)。捕获组根据其左括号的位置进行编号。 (
首先出现的群组是“1”,第二个(
是群组“2”,依此类推。根据您使用的正则表达式引擎,您也可以使用命名捕获组(?<name>
... )
(我知道.NET支持它们)。然后,您将使用引擎的方法来检索捕获组的值。
例如,以下正则表达式将匹配:
v
或value
(
)
可选值将存储在“值”捕获组中。您需要更改值组内的表达式以匹配值的格式。
v(?:alue)?\((?<value>[a-zA-Z]*)\)
(使用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
。