2013-07-18 3 views
2
val AlphabetPattern = "^([a-z]+)".r 

def stringMatch(s: String) = s match { 
case AlphabetPattern() => println("found") 
case _ => println("not found") 
} 

Если я стараюсь,Scala регулярного выражения «начинается с строчными» не работает

stringMatch("hello") 

я получаю «не найден», но я ожидал, чтобы получить «нашел».

Мое понимание регулярных выражений,

[аз] = в диапазоне от 'A' до 'Z'
+ = больше предыдущего рисунка одного
^ = начинается с

So regex AlphabetPattern - это «все строки, начинающиеся с одного или нескольких алфавитов в диапазоне az»

Конечно, я что-то упускаю, хочу знать что.

+2

Имейте в виду, что вам не нужен '^' (и вам не понадобится '$'). Соответствие Regex, используемое в 'match', является совпадением .... Не найти/найти. I.e., он неотъемлемо закреплен на обоих концах. Чтобы получить поведение, похожее на поиск, вам нужно поставить '. *' На одном или обоих концах. –

+0

Это обман http://stackoverflow.com/q/17572225/1296806, на котором также был дан неверный ответ. @RandallSchulz см. Ответ. –

+0

Извините @ RandallSchulz (нехватка сна), я имел в виду, что мнемоника для «матча» пропускает неизбранное поведение, что является простым вариантом для API, который нуждается в рекламе. –

ответ

4

Заменить case AlphabetPattern() с case AlphabetPattern(_) и она работает. Шаблон выделения принимает переменную, к которой он привязывает результат. Здесь мы отбрасываем его, но вы можете использовать x или что-то еще.

редактировать: Далее на комментарий Рэндалла ниже, если вы проверите docs for Regex вы увидите, что она имеет unapplySeq, а не unapply метод, который означает, что он принимает несколько переменных. Если у вас есть неправильный номер, он не будет соответствовать, а как

list match { case List(a,b,c) => a + b + c } 

не будет соответствовать, если list не имеет ровно 3 элементов.

+1

В общем, количество переменных шаблона (здесь единственное '_') должно точно соответствовать количеству групп захвата в' Pattern' 'Regex''. Вы также можете заставить свой код работать, превратив парны в шаблон в группу, не связанную с захватом: '(?: [A-z] +)' –

+0

hooray для не-захвата. Рах для необслуживаемых. –

1

Есть некоторые проблемы с заявлением о матче. s match соответствует значению s, которое проверяется на уровне AlphabetPattern и _, что всегда равно _ с s никогда не соответствует "^([a-z]+)".r. Используйте один из методов find в Scala.Util.Regex, чтобы найти совпадение с данным `Regex.

Например, используя findFirstIn, чтобы найти первое совпадение строки в AlphabetPattern.

scala> AlphabetPattern.findFirstIn("hello") 
res0: Option[String] = Some(hello) 

stringMatch метод с использованием findFirstIn и тематическое заявление:

scala> def stringMatch(s: String) = AlphabetPattern findFirstIn s match { 
    | case Some(s) => println("Found: " + s) 
    | case None => println("Not found") 
    | } 

stringMatch: (s:String)Unit         

scala> stringMatch("hello")       
Found: hello 
Смежные вопросы