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感谢您的澄清,是的,我正在寻找答案,您的建议似乎符合确切的需要和解决方案-是;是有效的终结者请在问题中添加此详细信息。