前面有两个或多个特殊字符的正则表达式

regex precceded by two or more special character

本文关键字:特殊字符 正则表达式 前面 两个      更新时间:2023-09-26

我坚持创建regex,这样,如果单词以特殊字符开头或结尾,那么每一边都有多个regex, regex 'exec'方法应该抛出null。只有当单词在每一边都有一个括号时,'exec'方法应该给出结果。

如果字符串类似"(test)",则只有regex。Exec应该有其他组合的值,比如"((test))"或"((测试)或者"(test))",它应该是空的。下面的代码没有抛出空,它应该。请建议。

var w1 = "'(test')"; 
alert(new RegExp('(^|[' + ''(')' + '])(' + w1 + ')(?=[' + ''(')'   + ']|$)', 'g').exec("this is ((test))"))

如果您有一个单词列表并想要过滤它们,您可以执行以下操作:

string.split(' ').filter(function(word) {
  return !(/^[!@#$%^&*()]{2,}.+/).test(word) || !(/[!@#$%^&*()]{2,}$).test(word)
});

split()函数在一个空格字符处分割字符串并返回一个单词数组,然后我们可以filter

为了保留有效的单词,我们将测试两个正则表达式,看看单词是否分别以两个或两个以上的特殊字符开始或结束。

正则表达式分解

^ -表达式以以下

开头

[] -块中的单个字符

!@#$%^&*() -这些是我使用的特殊字符。用你想要的替换它们

{2,} -匹配前面两个或多个字符

.+ -匹配1个或多个字符

$ -表达式以以下

结尾

要这样使用exec函数,请执行以下操作

!(/^[!@#$%^&*()]{2,}.+/).exec(string) || !(/[!@#$%^&*()]{2,}$).exec(string)

如果我理解正确,你正在寻找包含(test)的任何字符串,在它的任何地方,正是这样,对吗?

在这种情况下,您可能需要以下内容:

var regExp = /.*[^)]'(test')[^)].*/;
alert(regExp.exec("this is ((test))"));   // → null
alert(regExp.exec("this is (test))" ));   // → null
alert(regExp.exec("this is ((test)" ));   // → null
alert(regExp.exec("this is (test) ...")); // → ["this is (test) ..."]

解释:

.* matches any character (except newline) between zero and unlimited times, as many times as possible.

[^)] match a single character but not the literal character )

这确保在给定的字符串中有你的测试字符串,但它只在每一边用一个大括号包装!

您可以使用以下正则表达式:

(^|[^(])('(test'))(?!'))

参见此处的regex演示,替换为$1<span style="new">$2</span>

regex具有一个替换组(^|[^(]),它匹配字符串^的开头或(以外的任何字符。这是一种变通,因为JS正则表达式引擎不支持向后看。

然后,('(test'))匹配并捕获(test)。注意,圆括号是转义的。如果它们不是,它们将被视为捕获组分隔符。

(?!'))是一个提前查找,确保在test)之后没有字面量的)。JS regex引擎完全支持提前查找。

JS代码片段:

var re = /(^|[^(])('(test'))(?!'))/gi; 
var str = 'this is (test)'nthis is ((test))'nthis is ((test)'nthis is (test))'nthis is ((test'nthis is test))';
var subst = '$1<span style="new">$2</span>'; 
var result = str.replace(re, subst);
alert(result);