【问题标题】:Regex - Match pattern containing at least non space character正则表达式 - 至少包含非空格字符的匹配模式
【发布时间】:2021-08-31 14:13:14
【问题描述】:

我有一个这样的字符串:

Select a, CASE 
WHEN 1 
THEN 
   CASE some text
     WHEN 2 THEN A 
   END 
END

我想用'CASE var WHEN' 替换每个'CASE (any non space) 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

有什么想法吗?

【问题讨论】:

    标签: java regex


    【解决方案1】:

    你可以使用:

    String reg = "(?i)(\\bcase\\s+)\\S((?!\\bCASE\\s).)*?(?=\\s+when\\b)";
    String repl = str.replaceAll(reg, "$1var");
    

    RegEx Demo

    正则表达式详细信息:

    • (?i):启用忽略大小写模式
    • (\bcase\s+):匹配单词case,后跟一个空格
    • \S: 匹配一个非空格
    • ((?!\bCASE\\s).)*?:匹配0个或多个字符,只要不包含CASE
    • (?=\s+when\\b):提前断言我们有 1+ 个空格,后面跟 when

    ONLINE DEMO

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 2018-05-03
      • 2015-04-23
      • 2022-11-24
      相关资源
      最近更新 更多