正则表达式查找丢失的引号

Regex to find missing quote

仅当内容缺少开头引号或结尾引号时,我才需要一个 perl 正则表达式来 select 内容。开始引号前面总是有一个等号 =。结束引号后可以跟 space、更多文本或回车符 return。在给定的一行中,可以检查许多属性(引号对)。

我试过 (?<!")(.*?)" 但那是一场灾难。我想也许我可以做一个简单的正则表达式找到 equle 符号,查看下一个字符并检查它是否是引号后跟文本和结束引号。但是,如果文本的开头或结尾没有引号,请添加它。

注意事项引号之间的文本始终是字符数据。将没有符号或 spaces.

<table pgwide="0" id="dvr_config_firmware>
<title>DFR Firmware</title>
<tgroup cols="2">
<colspec colname="col1>
<colspec colname="col2">

使用分支重置(?| ... ) (Perl) 您可以匹配信息形式
并使用简单的替换。
这将匹配两个缺失形式之一。

/=(?|(")([^"<>\s]*)()(?=[\s>]|\/>)|(?!")()([^"<>\s]*)("))/

替换为=""

https://regex101.com/r/2qvpLr/1

 = 
 (?|
    ( " )                         # (1)
    ( [^"<>\s]* )                 # (2)
    ( )                           # (3)
    (?= [\s>] | /> )
  | 
    (?! " )
    ( )                           # (1)
    ( [^"<>\s]* )                 # (2)
    ( " )                         # (3)
 )

非分支复位方式(Python):

r'=(?:(")([^"<>\s]*)()(?=[\s>]|\/>)|(?!")()([^"<>\s]*)("))'

替换为=""

https://regex101.com/r/IXFJb6/1

 = 
 (?:
    ( " )                         # (1)
    ( [^"<>\s]* )                 # (2)
    ( )                           # (3)
    (?= [\s>] | /> )
  | 
    (?! " )
    ( )                           # (4)
    ( [^"<>\s]* )                 # (5)
    ( " )                         # (6)
 )

-----------------------------

回应@JennyP 评论中的新情况:
a condition that must be in account which I wasn't told before. The attribute group can have spaces in it. For instanct <info date="09 JAN 2000 version="1.0"> there needs to be a quote after 2000.

可以做到,因为它不是xml/html,也不是属性关联的
带有解析标记。

因为这些正则表达式只是解析原始字符串,正如您在
中所呈现的那样 你的问题。

你不能把这个问题变成“如何解析xml/html”。
因此,请保持它只匹配原始的、有点成型的文本。

对于 Perl:

=(?|(")((?:(?![a-z]*=)[^"<>])*)()(?=[\s>]|/>)|(?!")()((?:(?![a-z]*=)[^"<>])*)("))

https://regex101.com/r/hXNBSx/1

对于Python:

=(?:(")((?:(?![a-z]*=)[^"<>])*)()(?=[\s>]|/>)|(?!")()((?:(?![a-z]*=)[^"<>])*)("))

https://regex101.com/r/U4sBOW/1

1。在没有空格的属性值上添加缺少的结束引号

问题首先是关于更正无效的 XML 块

<table pgwide="0" id="dvr_config_firmware>
<title>DFR Firmware</title>
<tgroup cols="2">
<colspec colname="col1>
<colspec colname="col2">

到有效的XML区块

<table pgwide="0" id="dvr_config_firmware">
<title>DFR Firmware</title>
<tgroup cols="2">
<colspec colname="col1">
<colspec colname="col2">

UltraEdit for Windows 版本 28.20.0.70 和 UEStudio 版本 21.10.0.24 是目前使用 Boost 库的 Perl 正则表达式引擎的最新版本。

中建议的 Perl 兼容正则搜索表达式是:

=(?|(")([^"<>\s]*)()(?=[\s>]|\/>)|(?!")()([^"<>\s]*)("))

它使用 UE v28.20.0.70 和 UES v21.10.0.24 以及其他一些不太旧的旧版本作为替换字符串产生正确的结果 =""

Python 与搜索表达式兼容的变体

=(?:(")([^"<>\s]*)()(?=[\s>]|\/>)|(?!")()([^"<>\s]*)("))

sln 下一步建议的替换字符串 ="" 一起使用也适用于示例数据的当前最新版本和以前的版本 UE/UES。

2。在带有空格的属性值上添加缺少的结束引号

JennyP 在评论中写道,XML 文件还可以包含一个带有空格的属性值,缺少结束引号,就像这个 XML 示例块中一样:

<table pgwide="0" id="dvr_config_firmware>
<title>DFR Firmware</title>
<tgroup cols="2">
<colspec colname="col1>
<colspec colname="col2">
<info date="09 JAN 2000 version="1.0">

现在的预期结果是:

<table pgwide="0" id="dvr_config_firmware">
<title>DFR Firmware</title>
<tgroup cols="2">
<colspec colname="col1">
<colspec colname="col2">
<info date="09 JAN 2000" version="1.0">

但是 sln 建议的 Perl 语法中的前两个正则表达式产生:

<table pgwide="0" id="dvr_config_firmware">
<title>DFR Firmware</title>
<tgroup cols="2">
<colspec colname="col1">
<colspec colname="col2">
<info date="09" JAN 2000 version="1.0">

" 中只包含日期的日期而不是整个日期,因为这两个正则表达式不是为具有一个或多个空格的属性值设计的,因为最初没有要求。

sln 建议的 Perl 兼容解决方案正在使用搜索表达式

=(?|(")((?:(?![a-z]*=)[^"<>])*)()(?=[\s>]|/>)|(?!")()((?:(?![a-z]*=)[^"<>])*)("))

="" 作为替换表达式字符串,在执行时产生 UE/UES 预期结果。

使用 Python 兼容搜索表达式的结果也是正确的

=(?:(")((?:(?![a-z]*=)[^"<>])*)()(?=[\s>]|/>)|(?!")()((?:(?![a-z]*=)[^"<>])*)("))

用替换字符串 ="".

@sln,干得好!

3。用空格

在属性值上添加缺少的引号

同时在 UltraEdit 论坛主题 Regular expression to search for attributes with missing a quote 中讨论了相同的任务。

我在 UltraEdit 论坛上发了一个更错误的回复 XML 块:

<table pgwide=0" id="dvr_config_firmware>
<title>DFR Firmware</title>
<tgroup cols="3">
<colspec colname=col1>
<colspec colname="col2">
<colspec colname="col3 attrib="xyz">
<applicdef verdate="18 Jan 2019 verstatus="ver">

第一个属性 pgwide 缺少开头的引号。属性值 col1 根本没有用引号引起来。属性值 col3 缺少结束引号,并且还有下一个属性,这也是最后一个 XML 元素的情况,其属性值带有空格并且缺少结束引号。

预期的 XML 块是:

<table pgwide="0" id="dvr_config_firmware">
<title>DFR Firmware</title>
<tgroup cols="3">
<colspec colname="col1">
<colspec colname="col2">
<colspec colname="col3" attrib="xyz">
<applicdef verdate="18 Jan 2019" verstatus="ver">

第二章 sln 建议的 Perl 和 Python 兼容表达式可以很好地在那些只缺少一个的属性值上添加引号无论是在开始还是结束。但是属性值 col1 没有用引号引起来。这当然不是任务的要求。

我建议使用两个 Perl 兼容的正则表达式替换来获得预期的结果:

  1. 使用 \w=\K([^"=>]+)(?=>) 搜索并使用 """" 作为替换字符串,将这些属性值括在引号中,两个引号都缺失,例如 col1.
  2. 使用 \w=\K(?:(?!")|"[^">]*\K(?=>)|"[^ >"]++(?= \w+=)\K|"(?:[^ >"]++(?![>"])(?! \w+=) )+[^ ">]+\K) 搜索并仅使用 " 在仅缺少一个引号的属性值的开头或结尾插入缺少的引号。

UltraEdit 论坛成员 Fleggy 发布了另一个解决方案,使用条件 Perl 兼容的正则表达式搜索字符串 \w=\K(")?([\w ]+)(?(1)(?!")|"?)(?!\w*[="]) 并替换字符串 "" 也适用于记事本++.

4。使用空格

在属性值上添加安全缺失的引号

上面写的所有正则表达式都有一个问题:
他们还可以修改用引号括起来的属性值。

示例:XML 块已经是:

<table pgwide="0" id="dvr_config_firmware">
<title>DFR Firmware</title>
<tgroup cols="3">
<colspec colname="col1">
<colspec colname="col2">
<colspec colname="col3" attrib="xyz">
<applicdef verdate="18 Jan 2019" verstatus="ver">

正则表达式替换的使用不应导致对该块的任何修改。但是 none 的正则表达式替换了上面的内容,在此块上执行时不执行任何操作。属性值 18 Jan 2019 导致再插入一个 ",这使得 XML 块对于 XML 解析器无效。

但是感谢 Fleggy,还有一个解决方案可以在属性值上添加安全缺失的引号,这些属性值可以有空格并且在开头或结尾处缺少引号结束或两侧,而正确引用的属性值未以任何方式修改。

此任务的最终 Perl 兼容正则搜索表达式是:

\w=\K(")?([\w ]+)(?(1)(?(?=")(*SKIP)(*FAIL))|"?)(?!\w*=)

替换表达式字符串为:""

谢谢你,Fleggy