匹配方括号内的内容,包括嵌套的方括号

德里玛

我试图编写一个扰流器识别系统,以便将字符串中的任何扰流器替换为指定的扰流器字符。

我想匹配一个用方括号括起来的字符串,这样方括号内的内容就是捕获组1,包括周围括号在内的整个字符串就是匹配项。

我目前正在使用\[(.*?]*)\]中,这个答案找到了表达的轻微修饰这里,我也想嵌套的方括号是捕获组1的一部分。

该表达式的问题在于,尽管它可以工作并匹配以下内容:

  • Jim ate a [sandwich]匹配[sandwich]sandwich作为第1组
  • Jim ate a [sandwich with [pickles and onions]]匹配[sandwich with [pickles and onions]]sandwich with [pickles and onions]作为第1组
  • [[[[]匹配[[[[][[[作为第1组
  • []]]]匹配[]]]]]]]作为第1组

但是,如果我要匹配以下内容,它将无法正常工作:

  • Jim ate a [sandwich with [pickles] and [onions]] 都匹配:
    • [sandwich with [pickles]sandwich with [pickles第1组一起
    • [onions]]onions]第1组一起

什么表情,我应该使用这样它匹配[sandwich with [pickles] and [onions]]sandwich with [pickles] and [onions]作为第1组?

编辑

由于似乎无法使用正则表达式在Java中实现此功能,是否有替代解决方案?

编辑2

我还希望能够按找到的每个匹配项来拆分字符串,因此,由于String.split(regex)方便,正则表达式的替代方案将更难实现这是一个例子:

  • Jim ate a [sandwich] with [pickles] and [dried [onions]] 匹配所有:
    • [sandwich]sandwich第1组一起
    • [pickles]pickles第1组一起
    • [dried [onions]]dried [onions]第1组一起

拆分句子应如下所示:

Jim ate a
with
and
威克多·斯特里比尤(WiktorStribiżew)

更直接的解决方案

此解决方案将省略空白或仅空白子字符串

public static List<String> getStrsBetweenBalancedSubstrings(String s, Character markStart, Character markEnd) {
    List<String> subTreeList = new ArrayList<String>();
    int level = 0;
    int lastCloseBracket= 0;
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
            if (c == markStart) {
                    level++;
                    if (level == 1 && i != 0 && i!=lastCloseBracket &&
                        !s.substring(lastCloseBracket, i).trim().isEmpty()) {
                            subTreeList.add(s.substring(lastCloseBracket, i).trim());
                }
            }
        } else if (c == markEnd) {
            if (level > 0) { 
                level--;
                lastCloseBracket = i+1;
            }
            }
    }
    if (lastCloseBracket != s.length() && !s.substring(lastCloseBracket).trim().isEmpty()) {
        subTreeList.add(s.substring(lastCloseBracket).trim());  
    }
    return subTreeList;
}

然后,将其用作

String input = "Jim ate a [sandwich][ooh] with [pickles] and [dried [onions]] and ] [an[other] match] and more here";
List<String> between_balanced =  getStrsBetweenBalancedSubstrings(input, '[', ']');
System.out.println("Result: " + between_balanced);
// => Result: [Jim ate a, with, and, and ], and more here]

原始答案(更复杂,显示了提取嵌套括号的方法)

您还可以提取平衡括号内的所有子字符串,然后将其拆分:

String input = "Jim ate a [sandwich] with [pickles] and [dried [onions]] and ] [an[other] match]";
List<String> balanced = getBalancedSubstrings(input, '[', ']', true);
System.out.println("Balanced ones: " + balanced);
List<String> rx_split = new ArrayList<String>();
for (String item : balanced) {
    rx_split.add("\\s*" + Pattern.quote(item) + "\\s*");
}
String rx = String.join("|", rx_split);
System.out.println("In-betweens: " + Arrays.toString(input.split(rx)));

并且此函数将找到所有[]平衡的子字符串:

public static List<String> getBalancedSubstrings(String s, Character markStart, 
                                     Character markEnd, Boolean includeMarkers) {
    List<String> subTreeList = new ArrayList<String>();
    int level = 0;
    int lastOpenBracket = -1;
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if (c == markStart) {
            level++;
            if (level == 1) {
                lastOpenBracket = (includeMarkers ? i : i + 1);
            }
        }
        else if (c == markEnd) {
            if (level == 1) {
                subTreeList.add(s.substring(lastOpenBracket, (includeMarkers ? i + 1 : i)));
            }
            if (level > 0) level--;
        }
    }
    return subTreeList;
}

IDEONE演示

代码执行的结果:

Balanced ones: ['[sandwich], [pickles], [dried [onions]]', '[an[other] match]']
In-betweens: ['Jim ate a', 'with', 'and', 'and ]']

鸣谢:的getBalancedSubstrings基础是peter.murray.rust的答案,即如何在Java正则表达式中拆分此“树状”字符串?发布

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

正则表达式匹配方括号内大括号内的字符串

来自分类Dev

RegEx 用于匹配方括号内没有括号的单词

来自分类Dev

在特定字符后匹配方括号中的所有内容

来自分类Dev

Java扫描器不匹配方括号

来自分类Dev

正则表达式匹配方括号

来自分类Dev

正则表达式匹配方括号

来自分类Dev

匹配并捕获方括号内的(大写)字母

来自分类Dev

正则表达式匹配方括号内的字符串

来自分类Dev

R RegEx:匹配方括号内的所有双引号(“)字符

来自分类Dev

匹配方括号内的确切字符串-颜色印刷

来自分类Dev

AWK匹配方括号内的确切字符串

来自分类Dev

如何匹配方括号内的所有特定字符串

来自分类Dev

搜索模式以包括方括号

来自分类Dev

从字符串中删除方括号,包括方括号内的文本

来自分类Dev

嵌套的“ if”,缺少右花括号或方括号

来自分类Dev

php regex-在方括号内获取带有方括号的内容

来自分类Dev

如何搜索内容但跳过方括号内的内容?

来自分类Dev

在方括号内搜索并替换

来自分类Dev

如何匹配第一对方括号内的所有内容

来自分类Dev

仅删除括号内的数字(方括号)

来自分类Dev

批处理文件:在方括号内使用方括号?

来自分类Dev

花括号与方括号

来自分类Dev

匹配数字,但排除方括号内的数字

来自分类Dev

使用纯JavaScript将内容隐藏在方括号内

来自分类Dev

正则表达式-检查方括号/括号是否未关闭(包括嵌套)

来自分类Dev

正则表达式(php)仅提取方括号内的数字或字母(不包括方括号)

来自分类Dev

正则表达式,用于匹配方括号和数字

来自分类Dev

Python正则表达式匹配方括号问题

来自分类Dev

Java //与RegExp和方括号不匹配

Related 相关文章

热门标签

归档