java - 正则表达式 - 至少包含非空格字符的匹配模式
问题描述
我有一个这样的字符串:
Select a, CASE
WHEN 1
THEN
CASE some text
WHEN 2 THEN A
END
END
我想将每个替换'CASE (any non space) WHEN'
为'CASE var WHEN'
'CASE WHEN'
(两个单词之间只有空格),不应该受到影响。
对于前面的示例,它应该给出:
Select a, CASE
WHEN 1
THEN
CASE var
WHEN 2 THEN A
END
END
试过这个:
string.replaceAll("CASE\\s*(.*\\S.*?)\\s*WHEN", "CASE var WHEN")
它在大多数情况下都有效,但当“CASE WHEN”(之间有空格)后跟另一个 CASE WHEN 时会失败。它用 var 替换了第一个 CASE 和最后一个 WHEN 之间的所有内容,这不是我想要的。
对于前面的示例,它给出:
Select a, CASE
var
WHEN 2 THEN A
END
END
任何想法?
解决方案
您可以使用:
String reg = "(?i)(\\bcase\\s+)\\S((?!\\bCASE\\s).)*?(?=\\s+when\\b)";
String repl = str.replaceAll(reg, "$1var");
正则表达式详细信息:
(?i)
:启用忽略大小写模式(\bcase\s+)
: 匹配单词case
后跟一个空格\S
: 匹配一个非空格((?!\bCASE\\s).)*?
: 匹配 0 个或多个字符,只要不包含CASE
(?=\s+when\\b)
: 向前断言我们有 1+ 个空格,后面跟在when
前面
推荐阅读
- android - 找出当用户按下按钮时,他的手指在 android 中的按钮之外移动
- javascript - 我想在 Action on Google 中添加列表
- mfc - 通过引用使用 CString 参数调用函数时出错
- java - 在 Spring 中实现后台进程
- java - 如何通过 Selenium 和 Java 定位多个元素在相同标签中具有相同 ID、名称和属性的元素
- javascript - React Native 自定义 TextInput 占位符
- mongodb - IntelliJ 中的 Mongo Explorer 不显示集合
- mongodb - Mongoose:如何在 Object 中插入新字段?
- regex - 正则表达式 - 从专有名称中提取 OU
- node.js - 只用nodejs从mongodb获取一部分数据