2015-04-13 3 views
0

(все примера можно запустить через лестницу РЕПЛ или SBT консоли)Scala многострочный регулярное выражение/регулярное выражение не работает

У меня есть эта многострочный строка:

val a= "A0DA000043\n"+ 
"A020000008933F57845F706921\n"+ 
"A0A0000000 (9000)\n"+ 
"A0A40000027FDE (9FXX,9000) \n"+ 
"84E400000BD2012F261C86BC6C3C679F (6101,9000)\n"+ 
"00A4040008A000000151000000 (61XX,9000)" 

Тогда у меня есть это регулярное выражение:

(?m)^ *(?:[0-9A-F]{2})+(?: +\([0-9A-FX,]+\))? *$ 

Я использую это так:

scala> """(?m)^ *(?:[0-9A-F]{2})+(?: +\([0-9A-FX,]+\))? *$""".r.pattern.matcher(a).matches() 
res10: Boolean = false 

, но если это сделать:

scala> ("""(?m)^ *(?:[0-9A-F]{2})+(?: +\([0-9A-FX,]+\))? *$""".r findAllIn a).toList 
res8: List[String] = List(A0DA000043, A020000008933F57845F706921, A0A0000000 (9000), "A0A40000027FDE (9FXX,9000) ", 84E400000BD2012F261C86BC6C3C679F (6101,9000), 00A4040008A000000151000000 (61XX,9000)) 

возвращает все строки. Но мне интересно, почему .matches() не работает.

Если я попробовать одну строку в .matches

scala> """(?m)^ *(?:[0-9A-F]{2})+(?: +\([0-9A-FX,]+\))? *$""".r.pattern.matcher("A0A40000027FDE (9FXX,9000)").matches() 
res9: Boolean = true 

Теперь даже самый простой многострочный регулярное выражение не работает

"(?m)^foo$".r.pattern.matcher("foo\nfoo").matches() 
res38: Boolean = false 

что не так? может ли кто-нибудь дать пример о том, как использовать (? m) или даже попытаться сопоставить val a.

Я хочу знать, соответствует ли val линиям для моего регулярного выражения.

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

EDIT: я попробовал некоторые из ниже ответа, как и использование * для моей новой строки (ей?).. Он работал, например, 1, но он считает недопустимыми данные действительными. Пример:

scala> val c = "A0A0000000 (9000" 
c: String = A0A0000000 (9000 

scala> """(?s)^ *(?:[0-9A-F]{2})+(?: +\([0-9A-FX,]+\))? *.*$""".r.pattern.matcher(c).matches() 
res45: Boolean = true 
+0

'. *' В конце концов будет соответствовать всем остальным недопустимым символам жадно. –

ответ

0

Потому что matches пытается сопоставить всю строку. "(?m)^foo$" regex не будет соответствовать символу новой строки и следующей строке foo, присутствующей во входной строке foo\nfoo.

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

"(?s)^foo.*$".r.pattern.matcher("foo\nfoo").matches() 
+0

Вы могли бы сделать это и в моей строке строки? Я попробовал "" "(? S)^* (?: [0-9A-F] {2}) + (?: + \ ([0-9A-FX,] + \))? *. * $" База данных ".r.pattern.matcher (a) .matches() в вашем комментарии. И это работает. это: «A0A0000000 (9000» по-прежнему считается действительным, хотя это не –

+1

, это совсем другая вещь, попробуйте '(? s)^(?: * (?: [0-9A-F] {2}) + (? : + \ ([0-9A-FX,] + \))? * \ N?) + $ 'В методе' matches'. –

+0

Привет, спасибо, это сработало. Но я получаю stackoverflow (в моем приложении)/scala repl зависает, когда строка слишком длинная. Например: «" »(? s)^(?: * (?: [0-9A-F] {2}) + (?: + \ ([0-9A- FX,] + \))? * \ N?) + $ "" ". R.pattern.matcher (" A0DC0504448001019000800102A4083010A95010880011C9700FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF (9000) "). Matches() –

Смежные вопросы