繁体   English   中英

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

[英]Regex to match everything (including new lines) between keywords

我正在编写一个vbscript文件来解析日志文件中的数据。 日志文件中有这种结构,总是以某种方式格式化:

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

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

谢谢。

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

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 ),你需要使正则表达式更具体,例如像: value="([^"]*)"

像这样的东西:

value\="([^"]*)"

或者,如果您想允许可能的空格:

value[[:space:]]?\=[[:space:]]?"([^"]*)"

从理论上讲,单词值后面是一个转义等号,后跟一个引号,后跟任何不是引号,然后是另一个引号。

我不熟悉VB脚本,但“除引号之外的任何部分”部分也应包括新行。 注意在其他语言中有开关包括新行。

Ex PHP使用/ s修饰符表示新行:

<?php
preg_match('/value\="([^"]*)"/s',$string);
?>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM