理解 Java 中的正则表达式:split("\t") vs split("\\t") - 它们啥时候都可以工作,啥时候应该使用它们
Posted
技术标签:
【中文标题】理解 Java 中的正则表达式:split("\\t") vs split("\\\\t") - 它们啥时候都可以工作,啥时候应该使用它们【英文标题】:Understanding regex in Java: split("\t") vs split("\\t") - when do they both work, and when should they be used理解 Java 中的正则表达式:split("\t") vs split("\\t") - 它们什么时候都可以工作,什么时候应该使用它们 【发布时间】:2011-04-15 07:26:18 【问题描述】:我最近发现我没有在我的代码中正确使用正则表达式。以制表符分隔字符串str
为例,我一直在使用str.split("\t")
。现在我意识到这是错误的,为了正确匹配标签,我应该使用str.split("\\t")
。
但是我碰巧偶然发现了这个事实,因为我正在寻找其他东西的正则表达式模式。你看,错误代码split("\t")
在我的情况下一直工作得很好,现在我很困惑,如果声明一个匹配制表符的正则表达式是错误的方法,为什么它会起作用。因此,问题在于,为了真正了解 Java 中如何处理正则表达式,而不是仅仅将代码复制到 Eclipse 中而不真正关心它为什么工作......
以类似的方式,我遇到了一段文本,它不仅是制表符分隔的,而且是逗号分隔的。更清楚地说,我正在解析的制表符分隔列表有时包括“复合”项,如下所示:item1,item2,item3
,为了简单起见,我想将它们解析为单独的元素。在这种情况下,适当的正则表达式应该是:line.split("[\\t,]")
,或者我在这里也弄错了吗?
提前致谢,
【问题讨论】:
所以您的列表是制表符和逗号分隔的,但有时制表符不是分隔符? 嗯...不。它是一个以制表符分隔的标识符列表,但是在元素中,有一些由逗号分隔的 id.s 对/三元组。见:pathwaycommons.org/pc/… 这个问题和答案也相关且有帮助。检查他们 [***.com/questions/1635764/… 【参考方案1】:\
被认为是 java 中的转义字符,因此要获得正确的正则表达式,您需要使用 \
转义 \
和 t 以指示选项卡。
This 教程将帮助更多
【讨论】:
感谢您的回复,尽管我认为您应该再次阅读原始问题...我已经说过我已经学会了获取正则表达式和转义的正确方法。我的问题是为什么“错误”的正则表达式仍然有效。顺便说一句,我在阅读教程后发布了问题...... Java 有转义字符来指示一些特殊字符,例如新行、反斜杠、制表符等。所以 (\\t==\t) 和 (\t=tab char)。但我不确定正则表达式如何在内部处理选项卡。【参考方案2】:当使用 "\t"
时,escape sequence \t
被 Java 替换为字符 U+0009。使用"\\t"
时,\\t
中的转义序列\\
被Java 替换为\
,从而产生\t
,然后regular expression 解析器将其解释为字符U+0009。
所以这两种符号都将被正确解释。只是换成对应字符时的问题。
【讨论】:
那么为什么使用split("\t")
解析制表符分隔的字符串会被认为是“错误的”?
@posdef 是吗? \t 制表符 ('\u0009') 是 oracle 参考告诉您的制表符正则表达式。见download.oracle.com/javase/1.4.2/docs/api/java/util/regex/…
@InsertNickHere - 实际上,oracle 参考告诉您在字符串中使用\t
。如果此字符串由文字给出,则需要将反斜杠加倍,请参见下一段:download.oracle.com/javase/1.4.2/docs/api/java/util/regex/… 但该参考资料还告诉您可以将x
用于字符x
,因此使用“\ t" 或 "\u0009"
@Carlos 好的,我不知道。
@InsertNickHere:好吧,我读过的帖子清楚地表明,任何正则表达式都应该在 Java 中使用额外的反斜杠进行转义,这使得我的单个反斜杠表达式“错误”。我有点傻眼,因为“错误”的表达确实在我的代码中起作用。我认为解释就像@Gumbo 上面所说的那样。以上是关于理解 Java 中的正则表达式:split("\t") vs split("\\t") - 它们啥时候都可以工作,啥时候应该使用它们的主要内容,如果未能解决你的问题,请参考以下文章