如何在结束标记之前搜索一些标点符号?

时间:2018-04-25 01:45:28

标签: c# regex

我在文件中有一些文字为

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

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

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

而不是<title>Erod&#x00E9;</title>作为&#34; ; &#34;是实体代码的一部分,因此被忽略。

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

是否有更高效的正则表达式模式,我不是很擅长正则表达式...

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

2 个答案:

答案 0 :(得分:1)

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

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

见这里

  

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

答案 1 :(得分:1)

正则表达式:

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

Demo

说明:

  • 字面匹配字符(区分大小写)
  • 。*匹配任何字符(行终止符除外)
  • *量词 - 在零和无限次之间匹配,尽可能多次,根据需要回馈(贪婪)
  • 非捕获组(?:。|,|:|;)
  • 第一选择。
  • \。匹配角色。字面意思(区分大小写)
  • 第二选择,
  • ,匹配字符,字面意思(区分大小写)
  • 第三种选择:
  • :匹配字符:字面意思(区分大小写)
  • 第四种选择;
  • ;匹配角色;字面意思(区分大小写)
  • 负面观察(?
  • 断言下面的正则表达式不匹配
  • &amp; #x字面匹配字符&amp; #x(区分大小写)
  • 匹配以下列表中的单个字符[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)范围内的单个字符(区分大小写)
  • ;匹配角色;字面意思(区分大小写)
  • &LT;匹配字符&lt;字面意思(区分大小写)
  • /匹配字符/字面(区分大小写)
  • 标题&GT;匹配字符标题&gt;字面意思(区分大小写)