我正在编写一个vbscript文件来解析日志文件中的数据。 日志文件中包含此结构,始终以某种方式格式化:
<name="ExecResponse" value="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXX==" />
如何匹配引号(XXXXX)之间的数据,即使是0行或更多行? 不是语言特定的,但我在Textpad中验证,所以不确定全局运算符是否可用,但在VBScript中它们是。
感谢。
答案 0 :(得分:2)
最简单的方法是使用/"[^"]*"/g
,假设所有引号都是正确平衡的,并且没有一个被转义。
答案 1 :(得分:1)
VBScript解决方案,因为您标记了问题vbscript:
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
演示:
>>> s = "<name=""ExecResponse"" value=""XXXXXXXXXXXXXXXXXXXXXXX" & vbNewLine & _
"XXXXXXXXXXXXXXXXXXXXXXX" & vbNewLine & _
"XXXXXXXXXXXXXXXXXXXXXXX" & vbNewLine & _
"XXXXXXXXXXXXXXXXXXXXXXX" & vbNewLine & _
"XXXXXXXXXXXXX=="" />"
>>> WScript.Echo s
<name="ExecResponse" value="XXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXX==" />
>>> Set re = New RegExp
>>> re.Pattern = """([^""]*)"""
>>> re.Global = True
>>> For Each m In re.Execute(s) : WScript.Echo m.SubMatches(0) : Next
ExecResponse
XXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXX==
实际正则表达式为"([^"]*)"
,但双引号必须加倍才能在字符串内转义它们。
如果您想要更具体的匹配(例如,只需value
属性的值),则需要使正则表达式更具体,例如像这样:value="([^"]*)"
。
答案 2 :(得分:0)
你可以使用积极的前瞻和积极的外观:
(?<=value\=")(\n|.)*?(?=")
您可能需要转义引号,具体取决于语言。
答案 3 :(得分:0)
这样的事情:
value\="([^"]*)"
或者,如果你想允许可能的空格:
value[[:space:]]?\=[[:space:]]?"([^"]*)"
理论上,单词值后跟一个转义等号后跟一个引号,后跟任何不是引号,然后是另一个引号。
我不熟悉VB脚本,但“除引号之外的任何内容”部分也应该包含新行。请注意,在其他语言中,有些开关包含新行。
Ex PHP使用/ s修饰符表示新行:
<?php
preg_match('/value\="([^"]*)"/s',$string);
?>