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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    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
代码运行次数:0
运行
AI代码解释
复制
underscore
%text%
~Text~
`Text`
underscore
``` Text ```

(正文)

~文本~

代码语言:javascript
代码运行次数:0
运行
复制

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

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-15 21:45:45

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(?:^|\b)
(?:\b|$)

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

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

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

代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

复制
相关文章
JAVA中替换字符的方法replace和replaceAll 区别
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32534855/article/details/90939899
DencyCheng
2019/06/14
3.2K0
Java---replace与replaceAll的区别
乍一看,字面上理解好像replace只替换第一个出现的字符(受javascript的影响),replaceall替换所有的字符,其实大不然,只是替换的用途不一样。
谙忆
2021/01/21
9790
滴滴笔试 Java replaceAll() 方法
选择 考了 Java replaceAll() 方法 我之前是真没用过 选择也就选错了
韩旭051
2021/04/14
8470
滴滴笔试 Java replaceAll() 方法
Python中的id()函数_怪异现象
那么,id(obj)和id(obj)是不是相等的呢?让我们来测试一下(Python3.7)
py3study
2020/01/13
7160
Java中的replaceAll()方法同时替换多个不同的字符串
需求场景 场景一 String str1 = "广东省,福建省,北京市,海淀区,河北省,上海市,...."; 需要把“省”、“市”、“区”一起去掉; 变成: 广东,福建,北京,海淀,河北,上海....
崔笑颜
2020/06/08
11.9K0
怪异的排序
咋一看,不就是先按姓名做排序,然后再分别对班组、机台号做排序么。按这个思路写出了 SQL(表结构及数据在文末),得到的结果和预期的有点不一样。
白日梦想家
2020/11/03
3630
【说站】js中replaceAll方法的实现
1、replaceAll()可以一次性替换所有匹配。同replace()一样,该方法接收两个参数。
很酷的站长
2022/11/23
1.7K0
【说站】js中replaceAll方法的实现
java中替换字符串特定字符replace,replaceAll,replaceFirst
String number = "123,456,5234,52345,63456,7456,7";
用户7886150
2021/04/07
2.6K0
hive weekofyear 怪异的姿势
今天在使用hive函数weekofyear的时候遇到一个奇怪的情况,原sql如下:
大数据工程师-公子
2019/03/14
7850
replaceAll坑
前两天遇到一个坑,在使用String.replace()和replaceAll的时候
阿超
2022/08/16
4860
Grep(Regex)中的正则表达式
grep是Linux中用于文本处理的最有用和功能最强大的命令之一。 grep在一个或多个输入文件中搜索与正则表达式匹配的行,并将每条匹配的行写入标准输出。
知忆
2021/06/02
2.8K0
Excel中6个怪异的公式,你知多少?
文 | 兰色幻想-赵志东 在excel中我们有时会看到一些奇奇怪怪的公式,为了帮助新手学习,兰色今天带大家一起盘点这些公式。 公式1:=Sum(表1:表20!A1) 揭密:这是Sum的多表求和公式 用
CDA数据分析师
2018/02/24
2.5K0
Excel中6个怪异的公式,你知多少?
【面试说】怪异的 JavaScript
在网上看到一个有趣的测试,访问地址 [1]。里面包含了 25 道选择题,每个都是一个简单的表达式,然后让你选择,都是一些 JavaScript 怪异行为的体现,最后网站生成答案和解析,帮助你更好的理解 JavaScript 怪异的行为。
GopalFeng
2022/08/01
3370
replace、replaceAll、replaceFirst
我相信很多人也跟我一样也有个误区,错把replace当成replaceFirst,把replaceAll当成replace
阿超
2022/08/21
1.4K0
正则表达式(四):Java regex
Java 作为一种被广泛使用的编程语言,从 jdk-1.4 开始,标准库提供了 java.util.regex 包来支持正则表达式的使用。正则在 Java 中的使用和 python 中略有区别,主要是使用方式上稍有差异。名称上的不同足可见一斑,python 中两个核心对象是 Pattern 和 Match ,而 Java 中则是 Pattern 和 Matcher。
zhipingChen
2018/09/13
1K0
mongodb 字符串查找匹配中$regex的用法
官网地址:https://docs.mongodb.com/manual/reference/operator/query/regex/#regex-case-insensitive
庞小明
2018/12/10
6.2K0
Java正则速成秘籍(一)之招式篇
目录 导读 概述 Pattern类 Matcher类 校验文本是否与正则规则匹配 案例:lookingAt vs find vs matches 查找匹配正则规则的文本位置 案例:使用start()、end()、group() 查找所有匹配正则条件的子序列 替换匹配正则规则的文本 案例:replaceFirst vs replaceAll 案例:appendReplacement、appendTail和replaceAl
用户1257215
2018/01/30
9660
Java中处理正则表达式的工具类——总有一个适合你
import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.haohaosh.common.util.string.EmptyUtil; /** * @项目名 ssh * @功能 正则表达式工具类 * @类名 RegexUtil * @作者 Java自学通 * @日期 Aug 30, 20113:29:10 PM *
用户1289394
2018/02/27
1.5K0
python regex replace
正则匹配-直接内容替换 s = 'dsoheoifsdfscoopaldshfowefcoopasdfjkl;' ss = s.replace('coop','###') print(s,'\n',ss) dsoheoifsdfscoopaldshfowefcoopasdfjkl; dsoheoifsdfs###aldshfowef###asdfjkl; import re regex = re.compile(r'coop') # 正则匹配替换 regex.sub('$$$$$','sdlaf
py3study
2020/01/08
2.4K0
Java正则速成秘籍(一)之招式篇
静默虚空
2018/01/05
1.1K0
Java正则速成秘籍(一)之招式篇

相似问题

Java Regex replaceAll()

31

Java regex replaceAll多行

30

Java replaceAll到javascript regex

13

Java RegEx replaceAll抛出ArrayIndexOutOfBoundsException

34

Java: String.replaceAll(regex,替换);

1010
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文