匹配字符,但前面没有
Match character but not when preceded by
我想替换所有的换行符,但只有当它们之前没有这两个字符{]
(两个,而不是其中一个)使用JavaScript。下面的表达式似乎完成了这项工作,但它破坏了其他正则表达式的结果,所以一定是出错了:
/[^'{']]'n/g
我做错了什么?
您是否需要能够剥离'n
, 'r'n
或两者?
这应该可以完成工作:
/(^|^.|[^{].|.[^']])'r?'n/gm
并且要求您将$1
放在替换字符串的开头。
为了回答你关于为什么/[^'{']]'n/
是错误的问题,这个正则表达式等于:"匹配任何既不是{
也不是]
的字符",后面跟着'n
,所以这错误地无法匹配以下内容:
here's a square]'n
see the following{'n
您还缺少结尾的g
标志,但您可能已经注意到。
当你使用[^'{']]
时,你正在使用一个字符范围:这代表"任何不是'{
或']
的字符"。这意味着匹配将在{'n
或}'n
上失败。
如果你想否定一个超过一个字符的模式,你需要一个否定的前瞻性:
/^(?!.*{]'n)([^'n]*)'n/mg
^(?! # from the beginning of the line (thanks to the m flag)
.*{]'n # negative lookahead condition: the line doesn't end with {]'n
)
([^'n]*) # select, in capturing group 1, everything up to the line break
'n
用
代替$1 + replacement_for_'n
我们所做的是逐行检查我们的行是否包含不需要的模式。
如果没有,我们在捕获第1组中选择直到结尾'n
的所有内容,然后用所有内容替换整行,然后用您想要替换'n
的内容。
演示:http://regex101.com/r/nM2xE1
不支持向后看,您可以这样模拟
stringWhereToReplaceNewlines.replace(/(.{0,2})'n/g, function(_, behind) {
return (behind || "") + ((behind === '{]') ? "'n" : "NEWLINE_REPLACE")
})
对于前面两个字符作为第二个参数的每个"'n"调用回调。回调必须返回替换"'n"和之前的2个字符的字符串。如果前两个字符是"{]"那么新行不应该被替换所以我们返回匹配的完全相同的字符串,否则我们返回前两个字符(可能是空的)以及应该替换换行符
我的解决方案是:
([^{].|.[^']])'n
你的替换字符串应该是$1<replacement>
由于JavaScript不支持向后看,我们必须使用向前看。以下是正则表达式的工作方式:
- 除了
{
,然后是[^{].
-
]
-.[^']]
简单地说, - 最后一个
'n
[^{].|.[^']]
匹配..
匹配的所有内容,除了{]
捕获'n
之前的两个字符,因此可以使用$1
将它们重新插入到替换字符串中。
- 如何使用Javascript在给定的句子中找到大写单词并在其前面添加一个字符
- 如何获得前面有“”的字符;add_”;
- Regex查找前面没有特定字符的字符
- 如何完成此循环?连接前面的两个字符
- 为什么这个正则表达式返回前面的字符
- 如何全局替换不在前面加[字符]的字符
- 正则表达式以匹配单词,除非它们前面有字符
- 当前面的数字或前面字符的组合未知时提取字符串
- 将 n 个字符从字符串前面移到末尾
- 前面有特定字符串时的匹配字符
- 负向后看:匹配一个子字符串's不在一组字符的前面
- Regex匹配前面或后面没有其他字符的精确单词
- 检查字符串前面是否有特定字符
- 在Javascript中,如何在字符串中找到一个字符,并将其前面的所有字符放入变量中
- 光标前面的字符
- Javascript代码检查特殊字符,并在其前面添加双斜杠
- 替换前面或后面没有相同字符的字符
- 前面有两个或多个特殊字符的正则表达式
- RegEx-允许字母,数字,只有特殊字符逗号-但没有前面或后面的逗号
- 匹配前面没有'转义字符的双引号