使用分隔符替换Java正则表达式:或$

时间:2015-12-16 11:22:01

标签: 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

2 个答案:

答案 0 :(得分:1)

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

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

matches

  • ^ - 字符串开头
  • (.*?) - 在第一组之前尽可能少地捕获第1组符号(除了换行符之外)...
    • (?::(?!\\)|\$) - :未跟\(?::(?!\\))或文字$\$)< / LI>
  • .* - 匹配行的其余部分

请参阅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

答案 1 :(得分:0)

试试这个:

^(\w+(?=:\\.+):\\.+|[^:$]+)

您正在寻找第一个捕获组($ 1)