【问题标题】:Regex to match everything (including new lines) between keywords正则表达式匹配关键字之间的所有内容(包括新行)
【发布时间】:2014-03-14 19:49:56
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

  • @CodeJockey:那行不通(至少在 VBScript 中不行); ECMAScript 没有 DOTALL 修饰符。
  • 这就是该页面的内容-它还建议了[\s\S]的替代方法,我已经使用过-这就是为什么我将其放在评论而不是答案中的原因;也因为你提出了另一种选择,而我正在给婴儿打嗝。最终编辑 - 当您搜索“VBScript regex newline”时,它是 Google 上的第二个链接
  • @CodeJockey:哎呀。我只是在链接中阅读了“点”,但未能检查该页面。我很抱歉。

标签: regex vbscript newline


【解决方案1】:

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

【讨论】:

  • 我试过了,它匹配:'ExecResponse'、"value="等...但不是数据(XXX's)
  • @Chinobling:嗯,ExecResponse 也在引号之间,所以我假设你也想匹配它。但是,它不匹配" value:",因为每个字符只能匹配一次(请参阅regex101.com/r/jD6cJ6)。如果您想将匹配限制为以 value= 开头的那些,只需使用 /value="([^"]*)"/g 并获取第 1 组的内容。
【解决方案2】:

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="([^"]*)"

【讨论】:

    【解决方案3】:

    类似这样的:

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

    如果你想允许可能的空格,或者这个:

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

    理论上,单词 value 后跟一个转义的等号,然后是一个引号,然后是不是引号的任何内容,然后是另一个引号。

    我不熟悉 VB 脚本,但“除引用之外的任何内容”部分也应该包含新行。请注意,在其他语言中,有一些开关可以包含新行。

    前 PHP 使用 /s 修饰符来换行:

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

    【讨论】:

      猜你喜欢
      • 2018-12-02
      • 2020-01-20
      • 2011-09-06
      • 1970-01-01
      • 2016-08-22
      • 2018-09-02
      • 1970-01-01
      • 2012-10-31
      • 1970-01-01
      相关资源
      最近更新 更多