用于将分隔符替换为 : or $ 的 Java 正则表达式

标签 java regex

我的作业遵循非标准命名约定运行,下面是一些作业示例:

=========================================
Job Name                     | New Name
----------------------------- ----------
JOB:/Level0_APP1_12345_0/      JOB
JOB:Level1_DBASW_t323dk23_p1   JOB
JOB$SAV:                       JOB
backup:SYNC1                   backup
QUERY:logs                     QUERY
QUERY$maps:                    QUERY
QUERY:                         QUERY 
FS1:\                          FS1:\    -- No change in name
PS:\MXMI                       PS:\MXMI -- No change in name
========================================

分隔符是 (;) 或 ($),以先到者为准。此外,正则表达式不应执行名称中包含 (:\) 的任务,如最后 2 个示例所示。

我使用了以下方法,但没有成功

Regex:
(:|\$[a-zA-Z\/0-9]+)|(\$[a-zA-Z\/0-9]+)|(:$)
(.*)((\:|\$)([a-zA-Z\/0-9]+|$))
(.*)((\:|\$)(.*|$))

Substitution -> $1

最佳答案

我会在这里使用一个简单的正则表达式:

^(.*?)(?::(?!\\)|\$).*

matches :

  • ^ - 字符串开头
  • (.*?) - 在第一个...之前将尽可能少的符号(换行符除外)捕获到组 1 中
    • (?::(?!\\)|\$) - 后面不跟 \: (带有 (?::(?!\\)) 或文字 $ (带有 \$)
  • .* - 匹配该行的其余部分

参见IDEONE demo :

List<String> strs = Arrays.asList("JOB:/Level0_APP1_12345_0/", "JOB:Level1_DBASW_t323dk23_p1",
      "JOB$SAV:", "backup:SYNC1","QUERY:logs","QUERY$maps:","QUERY:","FS1:\\","PS:\\MXMI");
for (String str : strs)
    System.out.println(str.replaceAll("^(.*?)(?::(?!\\\\)|\\$).*", "$1"));

输出:

JOB
JOB
JOB
backup
QUERY
QUERY
QUERY
FS1:\
PS:\MXMI

关于用于将分隔符替换为 : or $ 的 Java 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34310712/

相关文章:

java - 将 Base64 编码的 CER 文件保存到字符串

java - 多个字符的正则表达式优先级

key : value pair matching 的正则表达式

java - Java中以不同长度分割字符串

java - 连接变量参数列表

java - 想要在 Selenium 中创建一个计时器并执行一些操作,直到达到定义的时间段

c - C 中的正则表达式

python - 正则表达式提取字符串中的第一组数字及其后的所有单词

java - 程序类型已经存在 : info. hoang8f.fbutton.BuildConfig

java - 连同画线一起创建标签