Regex 使用正则表达式捕获函数及其值

Regex 使用正则表达式捕获函数及其值,regex,Regex,我有一个包含以下函数调用的文本: set_name(value:"this is a test"); set_attribute(name:"description", value:"Some Multi Line Value"); 我正试图捕捉它的数据,这样我就可以回来了: “姓名” 或 “属性” 刚设置完的值_ 以及内部内容: value:"this is a test" 及 分别 我尝试使用这个正则表达式:

我有一个包含以下函数调用的文本:

set_name(value:"this is a test");
set_attribute(name:"description", value:"Some
Multi
Line
Value");
我正试图捕捉它的数据,这样我就可以回来了: “姓名” 或 “属性”

刚设置完的值_

以及内部内容:

value:"this is a test"

分别

我尝试使用这个正则表达式:

script_([A-Za-z_]+)\s*\(([\S\s]*?)\)
但如果这是set_属性值,则会失败:

set_attribute(name:"description", value:"Some
Multi
(Line)
Value");
因为在那里发现的第一个被正则表达式捕获

我正在寻找通过两个组捕获返回属性和内容的正则表达式:

name:"description", value:"Some
Multi
(Line)
Value"
你可以用

(?ms)^set_(\w+)\((.*?)\);$

细节

?ms-多行“^和$match now和dotall行的开始/结束。匹配换行符模式处于启用状态 ^-线路起点 set-一个文本字符串 \w+-第1组:一个或多个单词字符 \-一个字符 .*? - 第2组:任何0个或更多字符,尽可能少 \; - ; 子字符串。。。 $-在该行的末尾。 你可以用

(?ms)^set_(\w+)\((.*?)\);$

细节

?ms-多行“^和$match now和dotall行的开始/结束。匹配换行符模式处于启用状态 ^-线路起点 set-一个文本字符串 \w+-第1组:一个或多个单词字符 \-一个字符 .*? - 第2组:任何0个或更多字符,尽可能少 \; - ; 子字符串。。。 $-在该行的末尾。
每行以字符分号结尾。可以在字符之后添加正则表达式中的字符

set_([A-Za-z_]+)\s*\(([\S\s]*?)\);

每行以字符分号结尾。可以在字符之后添加正则表达式中的字符

set_([A-Za-z_]+)\s*\(([\S\s]*?)\);

可以使用以下正则表达式提取所需字符串,并设置单行或点全部标志,从而使点匹配行终止符

(?<=^set_)\w+(?=\()|(?<=\().*?(?=\);$)
注意,在Ruby单线模式或DOTALL模式中,点匹配线终止符表示为/m

正则表达式引擎执行以下操作

/
(?<=^set_)  : positive lookbehind asserts match is preceded by `set_` at
              the beginning of the string
\w+         : match 1+ word characters
(?=\()      : positive lookahead asserts following character is '('
|           : or
(?<=\()     : positive lookbehind asserts match is preceded by '('
.*?         : match 0+ characters, as few as possible
(?=\);$)    : positive lookahead asserts match is followed by ');' at
            : the end of the line
/m          : flag to cause '.' to match line terminators

可以使用以下正则表达式提取所需字符串,并设置单行或点全部标志,从而使点匹配行终止符

(?<=^set_)\w+(?=\()|(?<=\().*?(?=\);$)
注意,在Ruby单线模式或DOTALL模式中,点匹配线终止符表示为/m

正则表达式引擎执行以下操作

/
(?<=^set_)  : positive lookbehind asserts match is preceded by `set_` at
              the beginning of the string
\w+         : match 1+ word characters
(?=\()      : positive lookahead asserts following character is '('
|           : or
(?<=\()     : positive lookbehind asserts match is preceded by '('
.*?         : match 0+ characters, as few as possible
(?=\);$)    : positive lookahead asserts match is followed by ');' at
            : the end of the line
/m          : flag to cause '.' to match line terminators

使用2个捕获组获取值的另一种方法是重复匹配组2中开始括号和结束括号之间的key:values对

^set_([A-Za-z_]+)\s*\((\w+:"[^"]+"(?:, ?\w+:"[^"]+")*)\);
解释

^set_uu匹配set_uu构成字符串的开头 捕获组1 [A-Za-z_]+匹配1+次以上列出的任意一个 封闭组1 \s*\匹配0+空格字符和开头 捕获组2 \w+:[^]+匹配1+单词字符,然后从开始到结束 ?:,?\w+:[^]+*可以选择重复前面的模式,前面有逗号和可选空格 封闭组2 \; 匹配结束
使用2个捕获组获取值的另一种方法是重复匹配组2中开始括号和结束括号之间的key:values对

^set_([A-Za-z_]+)\s*\((\w+:"[^"]+"(?:, ?\w+:"[^"]+")*)\);
解释

^set_uu匹配set_uu构成字符串的开头 捕获组1 [A-Za-z_]+匹配1+次以上列出的任意一个 封闭组1 \s*\匹配0+空格字符和开头 捕获组2 \w+:[^]+匹配1+单词字符,然后从开始到结束 ?:,?\w+:[^]+*可以选择重复前面的模式,前面有逗号和可选空格 封闭组2 \; 匹配结束
你是说像这样吗?设置“[A-Za-z”+\s*\\w+:[^]+?:,?\w+:[^]+*\”;如果代码格式良好,您可以依赖;在作为匹配结束分隔符的行末尾,ms^set\uw+\.*;$,请参阅。如果您需要答案,请指定模式要求,上述两个建议基于假设,因此不能被视为有效答案,仅凭猜测。@WiktorStribiżew感谢您的澄清,是的,我正在寻找答案,您的建议似乎符合确切的需要和解决方案-是;是有效的终结者吗?那么请在问题中加上这个细节。你的意思是这样吗?设置“[A-Za-z”+\s*\\w+:[^]+?:,?\w+:[^]+*\”;如果代码格式良好,您可以依赖;在作为匹配结束分隔符的行末尾,ms^set\uw+\.*;$,请参阅。如果您需要答案,请指定模式要求,上述两个建议基于假设,因此不能被视为有效答案,仅凭猜测。@WiktorStribiżew感谢您的澄清,是的,我正在寻找答案,您的建议似乎符合确切的需要和解决方案-是;是有效的终结者请在问题中添加此详细信息。