2015-06-18 2 views
-3

Я хочу, чтобы разбить строку на основе текста классификатора, напримерразбить строку на основе текста квалификационных регулярных выражений Java

"1","10411721","MikeTison","08/11/2009","21/11/2009","2800.00","002934538","051","New York","10411720-002",".\Images\b.jpg",".\RTF\b.rtf" 

Qualifer = " Spliter = ,

Я хочу, чтобы разбить строку на основе Spliter , но если Spliter входит в квалификатор ", чем игнорировать его и возвращать строку, включая Spliter.

Регулярное выражение, я использую это (?:|,)(\"(?:[^\"]+|\"\")*\"|[^,]*)

но это регулярное выражение возвращает только запятые, пожалуйста, помогите мне в этом плане, как я новичок в регулярных выражениях

Обратите внимание, что если у нас есть символы новой строки в строку т.е. \r\n, чем она должна игнорировать символ новой строки

"1","10411","Muis","a","21/11/2009","2800.06","0029683778","03005136851","Awan","10411720-001",".\Images\a.jpg",".\RTF\a.rtf" 
"2","08/10/2009","07:32","Call","On-Net","030092343242342376543","Monk","00:00","1.500","0.000","10.000","0.200" 
"2","08/10/2009","02:50","Call","Off-Net","030092343242342376543","Une","08:00","1.500","2.000","20.000","3.500" 
"2","09/10/2009","03:55","SMS","On-Net","030092343242342376543","Mink","00:00","1.500","0.000","5.000","100.500" 
"2","09/10/2009","12:30","Call","Off-Net","030092343242342376543","Zog","01:01","3.500","3.000","70.000","6.500" 
"2","09/10/2009","09:11","Call","On-Net","030092343242342376543","Monk","02:30","2.00","2.000","90.000","4.000" 
+0

Что вы ожидали выход для данного входа? – anubhava

ответ

1

Вероятно, самые простое решение не ищет место для split, но find ИНГ элементов, которые вы хотите, чтобы вернуться. В вашем случае эти элементы

  • начинает "
  • заканчивается "
  • нет " внутри.

Так вы пытаетесь что-то вроде

String data = "\"1\",\"10411721\",\"MikeTison\",\"08/11/2009\",\"21/11/2009\",\"2800.00\",\"002934538\",\"051\",\"New York\",\"10411720-002\",\".\\Images\\b.jpg\",\".\\RTF\\b.rtf\""; 

Pattern p = Pattern.compile("\"([^\"]+)\""); 
Matcher m = p.matcher(data); 
while(m.find()){ 
    System.out.println(m.group(1)); 
} 

Выход:

1 
10411721 
MikeTison 
08/11/2009 
21/11/2009 
2800.00 
002934538 
051 
New York 
10411720-002 
.\Images\b.jpg 
.\RTF\b.rtf 
0

Удалите первый и последний символ всей строки. Затем разделить с «»

String test = "\"1\",\"10411721\",\"MikeTison\",\"08/11/2009\",\"21/11/2009\",\"2800.00\",\"002934538\",\"051\",\"New York\",\"10411720-002\",\".\\Images\\b.jpg\",\".\\RTF\\b.rtf\""; 

if (test.length() > 0) 
    test = test.substring(1, test.length()-1); 

System.out.println(Arrays.toString(test.split("\",\""))); 
+0

Я не хочу удалять первого и последнего символов из строки, потому что с этим определителем беспокоит, что я хочу решение с регулярным выражением – Ali

+0

Код, который я дал выше, разбивает ваш пример просто отлично. В чем проблема? –

+0

И код работает отлично с любой комбинацией разделителей классификаторов –

0

Вы можете разделить с помощью этого регулярное выражение:

String[] arr = input.split("(?=(([^\"]*\"){2})*[^\"]*$),+"); 

Это регулярное выражение будет разделен на запятые, если таковые находятся вне двойные кавычки, используя в предпросмотр, чтобы убедиться, что даже номер кавычек после запятой.

+0

@anubhave спасибо за ответ, но выражение, которое вы предоставили, не работает в случае, если у нас есть новые строковые символы \ r \ n в строке, он будет комбинировать последнее слово внутри qualifer и первое слово после новых символов строки. – Ali

+0

Ну, это сработало на вашем данный ввод. Вы должны отредактировать вопрос и показать код, где он не работает, тогда я могу определенно настроить его дальше. – anubhava

0

Это работает, даже если у вас есть новый character..try линии его из

String str="\"1\",\"10411721\",\"MikeTison\",\"08/11/2009\",\"21/11/2009\",\"2800.00\",\"002934538\",\"051\",\"New York\",\"10411720-002\",\".\\Images\\b.jpg\",\".\\RTF\\b.rtf\""; 
    System.out.println(Arrays.toString(str.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)"))); 
Смежные вопросы