正则表达式匹配关键字之间的所有内容(包括新行)

时间:2014-03-14 19:49:56

标签: regex vbscript newline

我正在编写一个vbscript文件来解析日志文件中的数据。 日志文件中包含此结构,始终以某种方式格式化:

<name="ExecResponse" value="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXX==" />

如何匹配引号(XXXXX)之间的数据,即使是0行或更多行? 不是语言特定的,但我在Textpad中验证,所以不确定全局运算符是否可用,但在VBScript中它们是。

感谢。

4 个答案:

答案 0 :(得分:2)

最简单的方法是使用/"[^"]*"/g,假设所有引号都是正确平衡的,并且没有一个被转义。

答案 1 :(得分:1)

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);
?>