【问题标题】:Convert RegEx from JavaScript to Java将 RegEx 从 JavaScript 转换为 Java
【发布时间】:2016-10-25 00:33:19
【问题描述】:

好的,所以我试图用“,”分割一个字符串,它们不在'['或']'内。我有一个适用于 JavaScript 的 RegEx,但无法将其转换为 Java 语法。

JS 正则表达式:

/,(?![^[]*])/g

例句:

ex1 , [ex2 , ex3 ] , ex 4 , ex 4, [ex , ex ]

它在 http://refiddle.com 上运行良好,但是当我尝试在 Java 中(在 Eclipse 下)使用 RegEx 时,我收到一条错误消息:

索引 10 附近的未封闭字符类 ,(?![^[]*])

我所做的只是删除开头的“/”和结尾的“/g”,我无法翻译语法。

实现这一目标的最佳方法是什么?

【问题讨论】:

    标签: javascript java regex syntax


    【解决方案1】:

    更新嵌套方括号支持

    由于您还需要支持嵌套方括号,并且方括号内的逗号应该被忽略,所以您需要一个简单的解析器来收集您需要的文本块。

    public static List<String> splitWithCommaOutsideBrackets(String input) {
        int BracketCount = 0;
        int start = 0;
        List<String> result = new ArrayList<>();
        for(int i=0; i<input.length(); i++) {
            switch(input.charAt(i)) {
            case ',':
                if(BracketCount == 0) {
                    result.add(input.substring(start, i).trim());// Trims the item!
                    start = i+1;
                }
                break;
            case '[':
                BracketCount++;
                break;
            case ']':
                BracketCount--;
                if(BracketCount < 0) 
                    return result; // The BracketCount shows the [ and ] number is unbalanced
                break;
            }
        }
        if (BracketCount > 0)
            return result; // Missing closing ]
        result.add(input.substring(start).trim()); // Trims the item!
        return result;
    }
    

    并将其用作

    String s = "ex1 , [ex2 , ex3 ] , [ hh3 , rt5 , w3 [ bn7 ] ] , ex 4 , ex 4, [ex , ex ]";
    List<String> res = splitWithCommaOutsideBrackets(s);
    for (String t: res) {
        System.out.println(t);
    } 
    

    sample Java code 的输出:

    ex1
    [ex2 , ex3 ]
    [ hh3 , rt5 , w3 [ bn7 ] ]
    ex 4
    ex 4
    [ex , ex ]
    

    请注意,不需要修剪项目。

    另外,在我 return result 的地方,您可能想要添加引发异常的代码,而不是像当时那样返回 result

    原答案

    在 Java 字符类中,][ 必须转义,这与 JavaScript 中您只需转义 ] 符号(在字符类内部)不同。

    String pat = ",(?![^\\[]*])";
                        ^^
    

    这是IDEONE demo

    String s = "ex1 , [ex2 , ex3 ] , ex 4 , ex 4, [ex , ex ]";
    String pat = ",(?![^\\[]*])";
    String[] result = s.split(pat);
    System.out.println(Arrays.toString(result));
    

    请注意,无论是在 Java 中还是在 JS 中,字符类之外的 ] 都不必转义。

    【讨论】:

    • 请注意,原始 O​​P 模式匹配一​​个 ,,该 , 后不带 0+ 个字符,而不是 [ 后跟 ]。也许,更安全的模式看起来像 ",(?![^\\[\\]]*])",但 CSV 解析器应该最适合此类字符串。
    • 如果只有一对括号,例如,您发布的 RegEx ",(?![^\[\]]*])" 工作正常。 var=[some,list,here] 但如果这些括号内有任何其他括号,则 RegEx 将打破 ex。 var=[some,list,here[something]].你知道如何解决这个问题吗?
    • 是与否,取决于字符串本身。有一件事是肯定的:你不能使用 Java 正则表达式来匹配嵌套结构。
    • 你确定吗?
    • Java regex 不支持正则表达式中的递归。这是事实。它也不支持平衡结构作为 .NET 正则表达式。
    猜你喜欢
    • 2015-12-31
    • 2021-08-26
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多