【问题标题】:Regex to fetch all matching values from xml node正则表达式从 xml 节点获取所有匹配值
【发布时间】:2011-09-02 08:06:40
【问题描述】:

this question 之后,它只给了我第一场比赛。我想将所有匹配项放入一个字符串或字符串数​​组中

这是我需要从中提取所有Category 的输出部分

<Trace Enabled="false">
        <ActiveCategories>
            <Category>ENVIRONMENT</Category>
            <Category>EXEC</Category>
            <Category>EXTERNALS</Category>
            <Category>FILESYSTEM</Category>
            <Category>INPUT_DOC</Category>
            <Category>INTERFACES</Category>
            <Category>NETWORKING</Category>
            <Category>OUTPUT_DOC</Category>
            <Category>PREPROCESSOR_INPUT</Category>
            <Category>REQUEST</Category>
            <Category>SYSTEMRESOURCES</Category>
            <Category>VIEWIO</Category>
            <Category>ALL</Category>
        </ActiveCategories>
        <SeverityLevel>ERROR</SeverityLevel>
        <MessageInfo>
            <ProcessAndThreadIds>true</ProcessAndThreadIds>
            <TimeStamp>true</TimeStamp>
        </MessageInfo>
        <TraceFile>
            <FileName>CMDS_log.txt</FileName>
            <MaxFileSize>1000000</MaxFileSize>
            <RecyclingMethod>Restart</RecyclingMethod>
        </TraceFile>
    </Trace>

现在通过下面的代码我只能获取ENVIRONMENT,我需要获取所有Category的值

def regexFinder(String myInput,String myRegex)
{
String ResultString
Pattern regex
Matcher regexMatcher

regex = Pattern.compile(myRegex, Pattern.DOTALL);
regexMatcher = regex.matcher(myInput);
if (regexMatcher.find()) {
    ResultString = regexMatcher.group();
}
}

tempResultString=regexFinder(ResultString,"(?<=<Category>)(?:(?!</Category>).)*")
    csm.cmengine_category(tempResultString)
    {           "${rs}"     }

【问题讨论】:

    标签: java regex


    【解决方案1】:

    不要使用正则表达式来解析 XML,使用解析器。

    RegEx match open tags except XHTML self-contained tags

    【讨论】:

    • 原则上你当然是对的。但在这种简单的情况下(机器生成的、格式良好的 XML,没有 cmets 或引用的字符串),我认为如果您知道正则表达式是一种快速而肮脏的解决方案,那么您可以摆脱它。
    • 机器生成通常意味着开发人员创建了生成它的程序,我担心它的有效性就像它是手动编写的一样!更严重的是,使用正确的工具完成正确的任务很重要。正则表达式不适合自己解析 XML。
    【解决方案2】:

    您需要重复应用.find() 来迭代所有结果:

    Matcher regexMatcher = regex.matcher(myInput);
    List<String> matchList = new ArrayList<String>();
    while (regexMatcher.find()) {
        matchList.add(regexMatcher.group());
    } 
    

    【讨论】:

    • 感谢您的回答。那么是进入String数组还是String呢?
    • 嗯,regexMatcher.group() 是一个字符串。我更改了我的示例,将结果放入 ArrayList
    猜你喜欢
    • 2019-10-08
    • 2010-10-13
    • 1970-01-01
    • 2013-05-09
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多