【问题标题】:Regex to split on delimiter正则表达式拆分分隔符
【发布时间】:2011-10-26 07:43:03
【问题描述】:

我有以下字符串:

;Spe \,\:\; cial;;;

我想用分号作为分隔符来分割它,但是以“\”开头的分号不应该算作分隔符。所以我想得到类似的东西

["", "Spe \,\:\; cial", "", "", ""]

更新:

Java 表示形式如下:

String s = ";Spe \\,\\:\\; cial;;;";

【问题讨论】:

  • 使用反斜杠作为转义字符,你想如何处理“\\;”? (即双反斜杠分号)
  • 是的,对不起。 \\;应该被视为分隔符 - 这是(转义的)反斜杠加分号。

标签: java regex


【解决方案1】:

使用negative look-behind:

(?<!\\\\);

(请注意,这个表达式中实际上只有一个\——即表达式应该是(?&lt;!\);——但是反斜杠字符必须进行两次转义:为了Java编译器的好处,一次,并再次为了正则表达式引擎的利益。)

【讨论】:

  • 也许我做错了什么:语法错误 U_REGEX_MISMATCHED_PAREN 靠近索引 6 (&lt;!\);
  • 代码是:String s = ";Spe \\,\\:\\; cial;;;"; String[] strs = s.split("(&lt;!\\);", 5);
  • 啊,好吧,你可能需要"(?&lt;!\\\\);" - 为了Java编译器的利益,转义一次\,为了正则表达式引擎的利益,再次转义它。
【解决方案2】:

您想提取以下正则表达式捕获的部分:;?([^;]*)\\\\?; 因此,只要找到匹配项,就在您的字符串中搜索此模式:

Pattern pattern = Pattern.compile(";?([^;]*)\\\\?;");
Matcher matcher = pattern.matcher(yourString);
List<String> tokens = new ArrayList<String>();
while(matcher.find()){
   tokens.add(matcher.group(1));
}

String[] yourArray = tokens.toArray(new String[0]); // if you prefer an array 
                                                    // rather than a list

【讨论】:

  • 我在第一行得到了“U_REGEX_MISSING_CLOSE_BRACKET”。
  • toArray 总是返回一个Object[] 使用toArray(new String(0)) 得到一个String[]
  • 是的,我不应该把反斜杠放在第一部分,我忘了双重转义第二部分。现在应该好了。
猜你喜欢
  • 1970-01-01
  • 2012-06-29
  • 2020-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 2011-02-24
相关资源
最近更新 更多