正则表达式匹配字符串中除<br>标记外的所有单词

时间:2019-07-29 21:03:53

标签: regex

我想用<br>标签将所有内容包装在字符串中,除了<div>标签之外。

因此,我的输入将类似于:

Hello this <br> is a test<br><br>,我的输出应该是

<span>Hello this </span><br><span> is a test</span><br><br>

我有用于匹配
标记的正则表达式,但是在尝试将其反转时会出现问题。

[^(<br ?/?>)]当前与不是<,b,r或>的每个字符匹配。这只是一个小问题,因为我不想匹配字符而不是
的单词。

1 个答案:

答案 0 :(得分:1)

我不知道Qt,但是它似乎使用了PCRE正则表达式。 (请参阅QRegExpQRegularExpression

PCRE具有向前和向后的操作,可以使我们形成解决方案:

((?<=^|<br>)(?:(?!<br>).)+)

在以下位置进行测试:https://regex101.com/r/fLVGk7/2/

这说:

  1. ( ... )-创建捕获组-可能不需要
  2. (?<=^|<br>)-匹配必须以字符串开头或<br>
  3. 开头
  4. (?: ... )-分组(不创建捕获组)
  5. (?!<br>).-不是<br>开头的任何字符

注意:

  • 3和4的组合(如(?:(?!<br>).)+)匹配每个不包含<br>的子字符串;例如,添加2会阻止匹配br><span...
  • <br>可以用更复杂的东西代替

限制:

  • 通常不能使用可变长度的正则表达式((?<=...)
  • 如果所需的“不匹配”将是可变长度的(例如<br\s*\?>),只要它具有唯一的固定长度后缀(例如>),就可以继续使用;在这种情况下,正则表达式变为:
((?<=^|SUFFIX)(?:(?!NONMATCH).)+)

(?<=^|>)(?:(?!<br\s*\/?>).)+)