理解 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") - 它们啥时候都可以工作,啥时候应该使用它们的主要内容,如果未能解决你的问题,请参考以下文章

JAVA 一个或多个空格分割字符串

java编程split(".")

java正则表达式提取网址

分享一个 Java String split 快速分割的方法

js中split正则表达式

js split 正则表达式过滤引号中的逗号