1.需求在一串字符中匹配{字符,但仅仅只匹配{字符
例如下列字符串中:
“{sfadf{{afad{}”
需要匹配到第一个{和第四个{,但不能匹配到第二个和第三个
2.目前我的正则如下,但不成功
[^{\b]({)[^{\b]
会把{前后的字符各匹配一个,但我不想要这样
3.我应该如何做,多谢
只匹配{字符,无论在任何地方,但不可以是连续的{{
1.需求在一串字符中匹配{字符,但仅仅只匹配{字符
例如下列字符串中:
“{sfadf{{afad{}”
需要匹配到第一个{和第四个{,但不能匹配到第二个和第三个
2.目前我的正则如下,但不成功
[^{\b]({)[^{\b]
会把{前后的字符各匹配一个,但我不想要这样
3.我应该如何做,多谢
只匹配{字符,无论在任何地方,但不可以是连续的{{
var result = [];
var str = '{sfadf{{afad{}';
var reg = /{+/g;
str.replace(reg, function (msg) {
if (!/{{2,}/.test(msg)) {
result.push(msg)
}
})
console.log(result)//["{", "{"]
两个以上不管 一个的话替换成两个
var str = '{sfadf{{{{afad{}';
var reg = /{+/g;
console.log(str.replace(reg, msg => /{{2,}/.test(msg) ? msg : "{{"))//{{sfadf{{{{afad{{}
先说用Java如何实现
public class GenericApp {
public static void main(String[] args) {
String str = "{sfadf{{{{afad{}";
String regex = "(?<!\\{)\\{(?!\\{)";
Pattern pattern = Pattern.compile(regex);
Matcher m = pattern.matcher(str);
while(m.find()) {
System.out.println(m.group(0));
}
}
}
这里使用了negative lookbehind
和negative lookahead
。
但是JavaScript并没有negative lookbehind
,那么如果只是使用negative lookahead
的特性,
匹配的结果多了一个{
,
多的是哪一个呢
当匹配到中间位置的这个{
时候往前看没有{
,但是它没有往后看。
所以说题主这个需求用javascript来写有一定难度
简化需求就是:
匹配字符"{", 其前后都不能有"{"。
1、匹配字符"{"
\{
2、其前不能有"{"
(?<!\{)\{
3、其后不能有"{"
\{(?!\{)
组合起来就是:
(?<!\{)\{(?!\{)
使用 lookahead 和 lookbehind 即可
对于不支持 lookbehind 的语言,可以把 lookbehind 换成普通的匹配,匹配再后手动处理