我的作业遵循非标准命名约定运行,下面是一些作业示例:
=========================================
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/