Regex 正则表达式匹配关键字之间的所有内容(包括新行)
我正在编写一个vbscript文件来解析日志文件中的数据。 日志文件中有此结构,总是以某种方式格式化:Regex 正则表达式匹配关键字之间的所有内容(包括新行),regex,vbscript,newline,Regex,Vbscript,Newline,我正在编写一个vbscript文件来解析日志文件中的数据。 日志文件中有此结构,总是以某种方式格式化: <name="ExecResponse" value="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
<name="ExecResponse" value="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXX==" />
即使有0行或多行新行,我如何在引号(XXXXX)之间匹配数据?
不是特定于语言的,但我正在Textpad中验证,因此不确定全局运算符是否对我可用,但在VBScript中可以
谢谢。最简单的方法是使用
/“[^”]*”/g
,假设所有引号都正确平衡,没有转义符。类似于以下内容:
value\="([^"]*)"
如果要允许可能的空间,请执行以下操作:
value[[:space:]]?\=[[:space:]]?"([^"]*)"
理论上,单词value后面跟一个转义的等号,后面跟一个引号,后面跟任何不是引号的东西,后面跟另一个引号。
我不熟悉VB脚本,但“除引号外的任何内容”部分也应该包含新行。注意,在其他语言中,有一些开关可以包含新行
Ex PHP对新行使用/s修饰符:
<?php
preg_match('/value\="([^"]*)"/s',$string);
?>
VBScript解决方案,因为您标记了问题: 演示:
>s=“”
>>>回音
>>>Set re=New RegExp
>>>re.Pattern=“”([^”“]*)”
>>>re.Global=True
>>>对于re.Execute中的每个m:WScript.Echo m.SubMatches(0):Next
执行响应
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXX==
实际的正则表达式是“([^”]*)”
,但双引号必须加倍才能在字符串中转义
如果您想要更具体的匹配(例如,仅仅是
value
属性的值),则需要使正则表达式更具体,例如:value=“([^”]*)”
@CodeJockey:这不起作用(至少在VBScript中不起作用);ECMAScript没有DOTALL修饰符。这就是该页面所说的-它还建议了我使用的[\s\s]
的另一种选择-这就是为什么我把它放在评论中而不是答案中的原因;还因为你建议了另一种选择,而我正在打嗝。最终编辑-这是搜索时谷歌上的第二个链接”VBScript regex newline“@CodeJockey:Oops.我刚在链接中读到“点”,未能查看页面。我很抱歉。我尝试了这个,它匹配:'ExecResponse'、'value=“,等等…但数据(XXX)@Chinobling:嗯,ExecResponse
也在引号之间,所以我假设您也想匹配它。它不匹配”value:“
,但是,因为每个字符只能匹配一次(请参阅)。如果要将匹配限制为前面有value=
,只需使用/value=“([^”]*)”/g
并获取组1的内容。
Set fso = CreateObject("Scripting.FileSystemObject")
txt = fso.OpenTextFile("C:\path\to\your.log").ReadAll
Set re = New RegExp
re.Pattern = """([^""]*)"""
re.Global = True
For Each m In re.Execute(txt)
WScript.Echo m.SubMatches(0)
Next