我有以下正则表达式(很久,我知道):
(?-mix:((?-mix:(?-mix:\{\%).*?(?-mix:\%\})|(?-mix:\{\{).*?(?-mix:\}\}?))
|(?-mix:\{\{|\{\%)))
我正在使用分割字符串 . 它在C#中正确匹配,但是当我将代码移动到Java时,它不匹配 . 这个正则表达式的任何特殊功能是C#-only吗?
来源如下:
String source = Pattern.quote("{% assign foo = values %}.{{ foo[0] }}.");
在C#中它是:
string source = @"{% assign foo = values %}.{{ foo[0] }}.";
C#版本是这样的:
string[] split = Regex.split(source, regex);
在Java中我尝试了两个:
String[] split = source.split(regex);
并且
Pattern p = Pattern.compile(regex);
String[] split = p.split(source);
3 回答
以下是包含您的代码的示例程序:http://ideone.com/hk3uy
Java和其他语言之间存在重大差异:Java不会将捕获的组添加为结果数组中的标记(example) . 这意味着所有分隔符都会从结果中删除,尽管它们将包含在.Net中 .
我知道的唯一选择是不使用
split
,而是获取匹配列表并手动拆分 .我认为问题在于你如何定义
source
. 在我的系统上,这个:相当于:
(也就是说,它添加了一个迷失的
\Q
和\E
),但是定义方法的方式,您的Java实现可以将其视为等效于此:(也就是说,插入大量的反斜杠) .
你的正则表达式看起来很好 . 这个程序:
版画
也就是说,它成功地将
{%b%}
,{{d}}
,{%f%}
,{{h}}
,{{
和{%
视为分裂点,具有您期望的所有非贪婪 . 但要记录下来,如果我将p
剥离到公正状态,它也会起作用;-)
使用
\\{
而不是\{
以及其他符号