【问题标题】:String parsing with regular expressions使用正则表达式解析字符串
【发布时间】:2010-05-11 18:41:44
【问题描述】:

我有以下字符串,我想将其解析为 List 或 String[]。

(Test)(Testing (Value))

最终结果应该是TestTesting (Value)

【问题讨论】:

  • 您有什么想问的吗?您是否至少尝试过自己先解决这个问题?如果有,结果如何?
  • 这不能使用正则表达式来完成。
  • 为了确保我明白,你想拔掉每一个最外面的括号,而忽略任何内部的括号?如果是这样,我相信@SLaks 是对的

标签: java regex parsing string


【解决方案1】:

如果我理解正确你需要TestTesting (Value),那么这里是正则表达式:

\(([^\)]+)\)\((.+)\)

它的掩码版本已准备好用于 java 字符串:

\\(([^\\)]+)\\)\\((.+)\\)

【讨论】:

  • 这不能处理无限嵌套。
  • @SLaks 好吧,它处理了他的确切问题,尽管return new String[] {"Test", "Testing (Value)"}; 也是如此。目前尚不清楚该解决方案究竟需要多通用
  • 谁说过无限嵌套?如果这就是您的意思(如果这是需要的话,因为从问题中不清楚)。
  • 是的,serg555 的解决方案正是我想要的。抱歉不清楚。谢谢!
【解决方案2】:

请阅读 php 手册的this 部分。它告诉您有关可用于匹配嵌套事物的递归模式以及相关问题。谷歌它以获取更多信息。

【讨论】:

  • 您可能希望包含您链接到的文章的概要或引用。这样我们就知道为什么我们应该关注您的链接。
  • @chilltemp:在这种情况下并不重要; OP 在 Java 中工作,它不支持递归正则表达式。
【解决方案3】:

这个问题确实很模糊,但在一个合理的解释下,这是可以照顾到某种格式的任意嵌套深度的解决方案:

    String text = "(T)(T(V))(1(2(3)2)1)(a*(b+(c-d))+(e/f))";
    String[] parts = text.split("(?<=\\))(?=\\()");
    System.out.println(java.util.Arrays.toString(parts));
    // prints "[(T), (T(V)), (1(2(3)2)1), (a*(b+(c-d))+(e/f))]"

基本上你想split)( 之间(使用断言)。不适用于所有情况,例如((.)(.)),不过就像很多人说的,题的要求比较模糊,一般的平衡括号问题是用Java regex解决不了的。

另见

【讨论】:

    【解决方案4】:
    /**
     * Parse string:
     *              when '$' symbol is encountered it deletes it's previous character and the '$' symbol itself
     *              when '@' symbol is encountered it erases the text previous to it and the '@' symbol itself 
     * @author Rama Bolishetty
     * @date Feb 27, 2016
     */
    package com.ram.utilities;
    
    import java.util.Scanner;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class ParseString {
        private static final Pattern dollarSymborPattern = Pattern.compile("[a-zA-Z0-9]{0,1}[$]{1}");
        private static final Pattern atSymbolPattern = Pattern.compile("[a-zA-Z0-9$]{0,}[@]{1}");
    
        public static String parseString(String inputString) {
            String parsedString = inputString;
            Matcher m = atSymbolPattern.matcher(parsedString);
            String matcher = replaceMatcher(m);
            parsedString = matcher != null ? matcher : parsedString;
            m = dollarSymborPattern.matcher(parsedString);
            parsedString = replaceMatcher(m);
            parsedString = matcher != null ? matcher : parsedString;
            return parsedString;
        }
    
        private static String replaceMatcher(Matcher m) {
            if (m.find()) {
                return m.replaceAll("");
            }
            return null;
        }
    
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            String inputString = scanner.nextLine();
            long sTime, eTime;
            System.out.println("STime:" + (sTime = System.currentTimeMillis()) + "\nParsed String:"
                    + ParseString.parseString(inputString) + "ETime:" + (eTime = System.currentTimeMillis()));
            System.out.println("Total milliseconds:" + (eTime - sTime));
            scanner.close();
        }
    }
    

    【讨论】:

    • 这根本没有解决问题。您似乎在任何提及字符串解析和正则表达式的问题上发布此代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2019-12-10
    • 2010-11-22
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多