正则匹配{字符

1.需求在一串字符中匹配{字符,但仅仅只匹配{字符
例如下列字符串中:
“{sfadf{{afad{}”
需要匹配到第一个{和第四个{,但不能匹配到第二个和第三个
2.目前我的正则如下,但不成功

[^{\b]({)[^{\b]

会把{前后的字符各匹配一个,但我不想要这样
3.我应该如何做,多谢

只匹配{字符,无论在任何地方,但不可以是连续的{{

阅读 2.6k
4 个回答

使用 lookahead 和 lookbehind 即可

(?<!\{)\{(?!\{)

对于不支持 lookbehind 的语言,可以把 lookbehind 换成普通的匹配,匹配再后手动处理

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 lookbehindnegative lookahead
但是JavaScript并没有negative lookbehind,那么如果只是使用negative lookahead的特性,
匹配的结果多了一个{

clipboard.png
多的是哪一个呢

clipboard.png
当匹配到中间位置的这个{时候往前看没有{,但是它没有往后看。
所以说题主这个需求用javascript来写有一定难度

简化需求就是:
匹配字符"{", 其前后都不能有"{"。
1、匹配字符"{"

\{

2、其前不能有"{"

(?<!\{)\{

3、其后不能有"{"

 \{(?!\{)

组合起来就是:

(?<!\{)\{(?!\{)

clipboard.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进