【问题标题】:How to search for some punctuations before a closing tag?如何在结束标签之前搜索一些标点符号?
【发布时间】:2018-04-25 01:45:28
【问题描述】:

我在文件中有一些文本

<title>Dhind</title>
<title>WT.</title>
<title>Plant Leaves:</title>
<title>Denia;</title>
<title>Erod&#x00E9;</title>

我试图找出在我的文件中结束标记 &lt;/title&gt; 之前是否有点、逗号、分号或冒号,除非有一个不代表 4 位十六进制实体的分号。 ..IE。搜索应该会找到以下结果

<title>WT.</title>
<title>Plant Leaves:</title>
<title>Denia;</title>

而不是&lt;title&gt;Erod&amp;#x00E9;&lt;/title&gt;,因为“;”是实体代码的一部分,因此被忽略。

我目前正在使用这个正则表达式 string pattern = @"([.,:]|((?&lt;!&amp;#x\w{4});))&lt;/title&gt;" 并与之匹配。

有没有更有效的正则表达式模式来做到这一点,我不是很擅长正则表达式...

注意:该文件不是有效的 xml 或 html,因此 xml/html 解析技术在这里没有用处。

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    这个正则表达式应该可以解决问题:

    (?<!&#x[0-9a-fA-F]{4});(?=<\/title>)|([,.:])(?=<\/title>)
    

    看这里

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

    【讨论】:

    • 你没有在表达式中使用&amp;#,会不会有问题?
    • 对不起,我的错:现在试试
    【解决方案2】:

    正则表达式:

    <title>.*(?:\.|,|:|;)(?<!&#x[0-9a-fA-F]{4};)<\/title>
    

    Demo

    解释:

    • 按字面意思匹配字符(区分大小写)
    • .* 匹配任何字符(行终止符除外)
    • * 量词 - 在零次和无限次之间匹配,尽可能多次,根据需要回馈(贪婪)
    • 非捕获组(?:.|,|:|;)
    • 第一种选择。
    • \。匹配字符。字面意思(区分大小写)
    • 第二选择,
    • ,匹配字符,字面意思(区分大小写)
    • 第三种选择:​​i>
    • :匹配字符:字面意思(区分大小写)
    • 第四个备选方案;
    • ;匹配字符;字面意思(区分大小写)
    • 负后视 (?
    • 断言下面的正则表达式不匹配
    • 匹配字符 字面意思(区分大小写)
    • 匹配以下列表中的单个字符 [0-9a-fA-F]{4}
    • {4} 量词 - 精确匹配 4 次
    • 0-9 介于 0(索引 48)和 9(索引 57)之间的单个字符(区分大小写)
    • a-f 介于 a(索引 97)和 f(索引 102)之间的单个字符(区分大小写)
    • A-F 介于 A(索引 65)和 F(索引 70)之间的单个字符(区分大小写)
    • ;匹配字符;字面意思(区分大小写)
    • / 匹配字符/字面意思(区分大小写)
    • title> 匹配字符 title> 字面意思(区分大小写)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-08
      • 2010-12-11
      • 2011-01-30
      • 2019-04-30
      • 2019-11-04
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      相关资源
      最近更新 更多