![](/img/trans.png)
[英]How to match a string between keywords containing any symbol (including new lines) in regex
[英]Regex to match everything (including new lines) between keywords
我正在编写一个vbscript文件来解析日志文件中的数据。 日志文件中有这种结构,总是以某种方式格式化:
<name="ExecResponse" value="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXX==" />
如何匹配引号(XXXXX)之间的数据,即使有0个或更多新行? 不是语言特定的,但我在Textpad中验证,所以不确定我是否可以使用全局运算符,但是在VBScript中它们是可用的。
谢谢。
最简单的方法是使用/"[^"]*"/g
,假设所有引号都是正确平衡的,并且没有一个被转义。
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
),你需要使正则表达式更具体,例如像: value="([^"]*)"
。
像这样的东西:
value\="([^"]*)"
或者,如果您想允许可能的空格:
value[[:space:]]?\=[[:space:]]?"([^"]*)"
从理论上讲,单词值后面是一个转义等号,后跟一个引号,后跟任何不是引号,然后是另一个引号。
我不熟悉VB脚本,但“除引号之外的任何部分”部分也应包括新行。 注意在其他语言中有开关包括新行。
Ex PHP使用/ s修饰符表示新行:
<?php
preg_match('/value\="([^"]*)"/s',$string);
?>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.