正则表达式从第二个管道切割

时间:2014-05-03 19:21:56

标签: regex expression

使用java正则表达式基本上减少分号分隔属性列表

2013-07-15 21:46:26|Dinner with James|Lucerne|MEDIATYPE;image|CATEGORY;25|365|423|IMGTOKEN;8adbfb5840349cac014052ded00f26da|TAGS;dinner|james|lucerne;

我想要达到的目的是:

  1. 在下一个分号后删除所有字符;
  2. 在分号前填写单词(在此示例中为MEDIATYPE);
  3. 切管
  4. 预期的最终结果:

    2013-07-15 21:46:26|Dinner with James|Lucerne
    

    我怎么能用正则表达式做到这一点?

    解决!谢谢! (.*?)(?=\|[^|;]+;)为我制定了

3 个答案:

答案 0 :(得分:1)

所以你想在分号之前拆分管道(|)?

这种模式可行:

\\|(?=[^|]*;)

解释

  • \\|一个字面管道字符。双重转义是Java语法
  • (?=[^|]*;)这是一个先行断言,它在管道后面找到一个分号。在分号前有任意数量的非管道符号。

示例:

public static void main(final String[] args) throws IOException {
    final String input = "2013-07-15 21:46:26|Dinner with James|Lucerne|MEDIATYPE;image|CATEGORY;25|365|423|IMGTOKEN;8adbfb5840349cac014052ded00f26da|TAGS;dinner|james|lucerne;";
    final String[] split = input.split("\\|(?=[^|]*;)");
    System.out.println(split[0]);
}

输出:

2013-07-15 21:46:26|Dinner with James|Lucerne

答案 1 :(得分:0)

您可以使用替换,匹配第一个管道,后面紧跟分号。我建议的原始正则表达式字符串是:

\|(?=[^|;]*;).*

这是Java字符串中的内容:

\\|(?=[^|;]*;).*

一个例子:

String text = "2013-07-15 21:46:26|Dinner with James|Lucerne|MEDIATYPE;image|CATEGORY;25|365|423|IMGTOKEN;8adbfb5840349cac014052ded00f26da|TAGS;dinner|james|lucerne;";
String result = text.replaceAll("\\|(?=[^|;]*;).*", "");
System.out.println("Result: " + result);

应该给你:

2013-07-15 21:46:26|Dinner with James|Lucerne

故障:

\\|      Match a literal pipe
(?=      Begin positive lookahead
  [^|;]* Any character except pipe or semicolon
  ;      A semicolon
)        End positive lookahead
.*       Anything else on this line

积极的前瞻是确保在管道之后有一个分号,其中“切割”开始时不再有任何管道或分号。

答案 2 :(得分:0)

使用此模式:

(.*?)(?=\|[^|;]+;)

Example