首页 > 解决方案 > 正则表达式 - 至少包含非空格字符的匹配模式

问题描述

我有一个这样的字符串:

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

任何想法?

标签: javaregex

解决方案


您可以使用:

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前面

ONLINE DEMO


推荐阅读