java - 正则表达式匹配任何数字,除非它是特定字符串的一部分

标签 java regex

抱歉,如果这是一个骗局,我确实进行了搜索,但似乎找不到与我的查询相匹配的内容。

我在 java 中有一个替换函数,它运行多个正则表达式来查找和替换特定的字符串。

其中一个正在查看数字,例如,如果它找到一个数字,它会在其周围添加空格;

test123> 测试 123

使用的正则表达式是“(([0-9]+)”并将其替换为“$1”

我现在遇到了一个问题,虽然在一些边缘情况下我不需要从特定字符串中拆分数字,例如哈希名称。所以我现在需要更新我的正则表达式以将任意数字组合用空格包裹起来,除非它匹配特定序列。

比如我想要下面的结果;

  • test123> 测试 123
  • 84test > 84 测试
  • 测试 md5 > 测试 md5
  • sha256 > sha256
  • 词二sha1 >词二sha1
  • w0rd > w 0 rd
  • 艾莎256 > 艾莎256
  • 单词 md 5 > 单词 md 5 等等

我已经尝试使用负向后视来匹配 md5、sha1、sha256 等词,但它似乎仍然 split 了数字。我确定这很简单,我做错了......“((?!md5)(\d +))”

基本规则是,字符串中的任何数字都应该用空格包围,除非它前面有单词 sha 或 md。如果数字和 md 或 sha 之间已经有空格,则应保留空格。 sha 或 md 可以是字符串的开头或前面有空格或 an。下划线,但不能是较长单词的结尾或单词的中间。

谢谢

最佳答案

以下正则表达式似乎有效:

(?<=\d)(?=\D)|(?<=\D)(?<!sha|md|^)(?=\d)|_

只需将上面的替换为一个空格即可。

Demo

Java代码:

List<String> inputs = Arrays.asList("test123", "84test", "test_md5", "sha256",
                                    "word_two_sha1", "w0rd");
for (String input : inputs) {
    String output = input.replaceAll("(?<=\\d)(?=\\D)|(?<=\\D)(?<!sha|md|^)(?=\\d)|_", " ");
    System.out.println(input + " > " + output);
}

这打印:

test123 > test 123
84test > 84 test
test_md5 > test md5
sha256 > sha256
word_two_sha1 > word two sha1
w0rd > w 0 rd

此处的基本正则表达式策略是在数字和非数字字符之间的边界处进行拆分,除非前面是shamd .

关于java - 正则表达式匹配任何数字,除非它是特定字符串的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62893732/

相关文章:

javascript - 需要帮助理解 Javascript 的 .match 方法

java - jsf 正则表达式验证期间允许使用 ascii 字符

javascript - 将 HTML 作为 JSON 传递的最佳实践

java - Spring Ajax Controller - 接受提交而不刷新页面

java - 每次获取 shell 脚本 255 的退出值

java - 如何让我的游戏变慢(降低 FPS)?

java - 删除空格后的文本

java - 线程程序规范的含义

regex - Perl-regex 在应该区分大小写时不区分大小写

jquery 如果 url 第一个路径名与 href 匹配,则