首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java: replaceAll RegEx中的怪异

Java: replaceAll RegEx中的怪异
EN

Stack Overflow用户
提问于 2020-05-16 04:52:16
回答 1查看 52关注 0票数 2

我正在尝试在Java中操作一个字符串来识别markdown options in Facebook Messenger

我在几个在线测试人员中测试了RegEx,它工作正常,但当我尝试用Java语言实现时,它只能识别由下划线包围的文本。我这里有一个例子说明了这个问题:

代码语言:javascript
运行
复制
    private String process(String input) {
        String processed = input.replaceAll("(\\b|^)\\_(.*)\\_(\\b|$)", "underscore")
            .replaceAll("(\\b|^)\\*(.*)\\*(\\b|$)", "star")
            .replaceAll("(\\b|^)```(.*)```(\b|$)", "backticks")
            .replaceAll("(\\b|^)\\~(.*)\\~(\\b|$)", "tilde")
            .replaceAll("(\\b|^)\\`(.*)\\`(\\b|$)", "tick")
            .replaceAll("(\\b|^)\\\\\\((.*)\\\\\\)(\\b|$)", "backslashparen")
            .replaceAll("\\*", "%");  // am I matching stars wrong?

    return processed;
}


public void test() {
    String example = "_Text_\n" +
            "*text*\n" +
            "~Text~\n" +
            "`Text`\n" +
            "_Text_\n" +     // is it only matching the first one?
            "``` Text ```\n" +
            "\\(Text\\)\n" +
            "~Text~\n";
    System.out.println(process(example));
}

我希望所有行都会匹配并被替换,但只有第一行匹配。我想知道这是不是因为它是第一行,所以我在中间复制了它,它匹配了两行。然后我想我可能遗漏了一些与特殊字符匹配的东西,所以我添加了一些代码片段来匹配星号,并用百分号替换它,它起作用了。我得到的输出是这样的:

代码语言:javascript
运行
复制
underscore
%text%
~Text~
`Text`
underscore
``` Text ```

(正文)

~文本~

代码语言:javascript
运行
复制

你知道我可能遗漏了什么吗?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-16 05:45:45

如果使用单词边界,则不需要交替匹配锚点,因为单词边界也会匹配开始和结束位置。所以这实际上是多余的匹配:

代码语言:javascript
运行
复制
(?:^|\b)
(?:\b|$)

这两个都可以被\b取代。

但是,看看你的正则表达式,请注意,只有下划线被认为是一个单词字符,而*~`不是单词字符,因此不能在这些字符周围使用\b,而应该使用\B,这与\b相反。

除此之外,还可以做一些更多的改进,比如使用一个否定的字符类来代替贪婪的.*,以及删除不必要的组。

代码:

代码语言:javascript
运行
复制
class MyRegex {
    public static void main (String[] args) {
        String example = "_Text_\n" +
                "*text*\n" +
                "~Text~\n" +
                "`Text`\n" +
                "_Text_\n" +     // is it only matching the first one?
                "``` Text ```\n" +
                "\\(Text\\)\n" +
                "~Text~\n";
        System.out.println(process(example));
    }

    private static String process(String input) {
        String processed = input.replaceAll("\\b_[^_]+_\\b", "underscore")
            .replaceAll("\\B\\*[^*]+\\*\\B", "star")
            .replaceAll("\\B```.+?```\\B", "backticks")
            .replaceAll("\\B~[^~]+~\\B", "tilde")
            .replaceAll("\\B`[^`]+`\\B", "tick")
            .replaceAll("\\B\\\\\\(.*?\\\\\\)\\B", "backslashparen");

        return processed;
    }
}

Code Demo

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61828149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档