我有以下文本
<a href="#" class="name">here is "quoted"</a> and another in "quote" and alone quote - ".
和我需要一个正则表达式,我能够替换所有的引号,除了引号包装属性值。因此,在上面的字符串中,它将替换引号换行词" quotes "one_answers";quote"和单引号,但引号包装"#"one_answers";className"作为属性值而不被替换。
字符串变成:
<a href="#" class="name">here is "quoted"</a> and another in "quote" and alone quote - ".
由于输入的嵌套性质,使用纯正则表达式表达此需求有点困难。处理此问题的一个相当简单的方法是使用以下带回调函数的正则表达式模式:
<w+.*?>|.*?(?=<|$)
如果我们匹配了HTML标记,那么在替换项的左侧,我们什么也不做。否则,我们有选择地将所有双引号替换为"
。下面是一个示例Python脚本,尽管这个问题可以在大多数编程语言中以类似的方式处理:
import re
inp = '<a href="#" class="name">here is "quoted"</a> and another in "quote" and alone quote - "'
output = re.sub(r'<w+.*?>|.*?(?=<|$)', lambda m: m.group().replace('"', '"') if not re.search(r'^<.*>$', m.group()) else m.group(), inp)
print(output)
这个打印:
<a href="#" class="name">here is "quoted"</a> and another in "quote" and alone quote - "
Regexr是一个很好的资源,可以查看您试图执行它的文本的regex结果,这就是我用来找出这个问题的答案的方法。
(?<!=|="[^"]+)"
工作原理:?<!
'negative lookbehind' -只匹配前面没有这个表达式的东西。可能不会在所有的浏览器,但似乎在Chrome/FF=
——文字等于号,以确保我们不触及任何看起来像一个财产分配像href=
|
——就像一个布尔OR
正则表达式,这个表达式匹配的意义="[^"]+
——一个等号,紧随其后的是报价,紧随其后的是一个或多个字符不引用"
——引用我们试图匹配
这个表达式的计算结果为"匹配所有不跟在等号后面的双引号,或者只跟在等号和开引号前面的一定数量的字符">