Понимание регулярных выражений в Java: split («\ t») против split («\\ t») - когда они оба работают и когда их следует использовать

Недавно я понял, что я не использую регулярные выражения в моем коде должным образом. Приведенный пример строки с разделителями табуляцииstrЯ используюstr.split("\t"), Теперь я понимаю, что это неправильно, и для правильного соответствия вкладок я должен использоватьstr.split("\\t").

Однако я случайно наткнулся на этот факт по чистой случайности, поскольку искал шаблоны регулярных выражений для чего-то другого. Вы видите, неисправный кодsplit("\t")в моем случае работал довольно хорошо, и теперь я не понимаю, почему это работает, если это неправильный способ объявления регулярного выражения для соответствия символу табуляции. Отсюда вопрос, чтобы понять, как на самом деле обрабатывается регулярное выражение в Java, а не просто копировать код в Eclipse и не заботиться о том, почему он работает ...

Подобным образом я натолкнулся на фрагмент текста, который не только разделен табуляцией, но и запятыми. Проще говоря, списки, разделенные табуляцией, которые я анализирую, иногда содержат «составные» элементы, которые выглядят так:item1,item2,item3 и я хотел бы проанализировать их как отдельные элементы, для простоты. В этом случае соответствующее выражение регулярного выражения должно быть:line.split("[\\t,]")или я тут тоже ошибаюсь ??

Заранее спасибо,

 Gumbo21 сент. 2010 г., 18:54
Таким образом, ваш список разделен табуляцией и запятой, но иногда вкладки не являются разделителями?
 Bouramas05 дек. 2017 г., 13:56
Этот вопрос и ответы также связаны и полезны. Проверь их [stackoverflow.com/questions/1635764/...
 posdef22 сент. 2010 г., 10:30
Ну нет. Это список идентификаторов, разделенных табуляцией, однако среди элементов есть несколько пар / триплетов идентификаторов разделенных запятыми. Увидеть:pathwaycommons.org/pc/...

Ответы на вопрос(2)

\ это считается escape-символом в Java, поэтому чтобы получить правильное регулярное выражение, вам нужно бежать\ с\ и т для обозначения таб.

это учебник поможет больше

 Jaydeep Patel22 сент. 2010 г., 07:20
В Java есть escape-символ для обозначения некоторых специальных символов, например новая строка, обратная косая черта, табуляция и т. д. Итак (\\ t == \ t) и (\ t = tab char). Но я не уверен, как regex внутренне заботится о tab.
 posdef21 сент. 2010 г., 18:42
Спасибо за ответ, хотя я думаю, что вы должны прочитать исходный вопрос еще раз ... Я уже заявил, что я узнал правильный способ получить регулярное выражение и побег. Мой вопрос, почему «неправильное» регулярное выражение все еще работает. Кстати, я разместил вопрос ПОСЛЕ чтения учебника ...
Решение Вопроса

"\t",escape-последовательность \t заменяется на Java с символом U + 0009. "\\t", escape-последовательность\\ в\\t заменяется на Java с\, в результате чего\t то интерпретируетсярегулярное выражение парсер как персонаж U + 0009.

Таким образом, обе записи будут правильно интерпретированы. Это просто вопрос, когда он заменяется соответствующим символом.

 deadpool30 апр. 2016 г., 11:10
А как сопоставить множественное вхождение? "\ t *"?
 InsertNickHere21 сент. 2010 г., 21:20
@ Карлос хорошо, Дидент знает об этом.
 InsertNickHere21 сент. 2010 г., 20:42
@posdef Это так? \ t Символ табуляции ('\ u0009') - это то, что говорит вам оракул для регулярного выражения табуляции. Увидетьdownload.oracle.com/javase/1.4.2/docs/api/java/util/regex/...
 Carlos Heuberger21 сент. 2010 г., 21:17
@InsertNickHere - на самом деле ссылка оракула говорит вам использовать\t в строке. Если эта строка задана литералом, вам нужно удвоить обратную косую черту, см. Следующий абзац:download.oracle.com/javase/1.4.2/docs/api/java/util/regex/... но ссылка также говорит о том, что вы можете использоватьx для персонажаx так что это не правильно использовать "\ t" или "\ u0009"
 posdef21 сент. 2010 г., 18:44
так почему же это считается «неправильным» в использованииsplit("\t") для анализа строки с разделителями табуляции?
 posdef22 сент. 2010 г., 10:35
@InsertNickHere: хорошо, в сообщениях, которые я прочитал, ясно сказано, что любое выражение регулярного выражения должно быть экранировано с дополнительной обратной косой чертой в Java, что делает мое единственное выражение с обратной косой чертой «неправильным». Я был немного ошеломлен, так как «неправильное» выражение сработало в моем коде. Я предполагаю, что объяснение таково, как @Gumbo.

Ваш ответ на вопрос