2016-09-30 3 views
1

Я немного борюсь с некоторым сопоставлением шаблонов в списке [Char]. Я хотел бы извлечь суб-списки, которые заключены в круглые скобки. Таким образом, я хотел бы извлечь «тест» в виде списка [Char], когда был указан «(тест)». Итак, в основном совпадение в List ('(', List [Char], ')'). Я могу сопоставлять List ('(', t, ')'), где t - один символ, но не переменное количество символов.Как сопоставить шаблон по списку ('(', List [Char], ')')?

Как это следует объявить?

val s = "(test)" 
s match { 
    case List('(',t,')') => { 
     println("matches single character") 
    } 
    case '('::x::y => { 
     //x will be the first character in the List[Char] (after the '(') and y the tail 
    } 
} 
+0

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

+0

Как и Travis, я бы выбрал выражение регулярного выражения. –

+0

@TravisBrown '+:' и ': +' экстракторов достаточно, и они уже определены в стандартной библиотеке. –

ответ

4
s match { 
    case '(' +: t :+ ')' => ... 
} 

Читайте о пользовательских экстракторов в Scala, а затем увидеть http://www.scala-lang.org/api/2.11.8/index.html#scala.collection. $ Двоеточие $ плюс $, чтобы понять, как это работает.

Обратите внимание, что он будет соответствовать любому подходящему Seq[Char], но строка на самом деле не одна; он может быть преобразован (неявно или явно). Таким образом, вы можете использовать один из

val s: Seq[Char] = ...some String or List[Char] 
val s = someString.toSeq 

Я ожидаю, что производительность для строки должны быть достаточно хорошо (и если это важно, не использовать это); но для больших List[Char] это будет довольно медленно.

+0

Я вижу, что: +/+: являются экстракторами, используемыми для деконструирования последовательностей головы/хвоста. Теперь можно расширить его с помощью Char +: '(' +: middle: + ')'. Я надеялся, что это будет возможно еще больше связать с этим, например List [Char] +: '(' +: middle: + ')'. Вы знаете способ расширения соответствия? – stian

+0

как это сделать: «test (test)», например .. – stian

+0

': +' и '+:' позволяют отделить только один элемент, поэтому он не будет работать для этого случая (вы могли бы написать '_ +: '(' +: middle: + ')' ', но он будет обрабатывать только тот случай, когда у вас есть 1 символ перед' ('. И вы не можете использовать' '' '' '' '' '' '' '' '' '' '' '' , 1,2,3) match {case s1 ++ s2 => ...} ', как бы вы определили, какая часть' s1', а какая 's2'? –

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