#regex #scala #match
#регулярное выражение #scala #сопоставление
Вопрос:
Я пытаюсь сопоставить следующую строку
"name type this is a comment"
Имя и тип определенно присутствуют.
Комментарий может существовать, а может и не существовать.
Я пытаюсь сохранить это в переменные n, t и c.
val nameTypeComment = """^(w s ){2}(?:[w s*)*(,,] )"""
str match { case nameType(n, t, c) => print(n,t,c) }
Это то, что у меня есть, но, похоже, не работает. Любая помощь приветствуется.
val nameType = """^(w )s ([w)(,] )""".r
Однако это работает, когда я пытался работать со строками только с именем и типом и без комментариев, которые представляют собой группу слов, которые могут быть или не быть там.
Комментарии:
1. Можете ли вы отредактировать свой вопрос, чтобы включить сообщение об ошибке?
2. Попробуйте ideone.com/RwG7yl
3. Регулярное выражение кажется слишком сложным для этого. Если они действительно разделены табуляцией, просто
split
наt
Ответ №1:
Обратите внимание, что ^(w s ){2}(?:[w s*)*(,,] )
регулярное выражение содержит только 1 группу захвата ( (w s )
), в то время как вы определяете 3 в match
блоке.
Содержит ^(w )s ([w)(,] )
только 2 группы захвата: (w )
и ([w)(,] )
.
Чтобы ваш код работал, вам необходимо определить 3 группы захвата. Кроме того, неясно, что такое разделители, позвольте мне предположить, что первые два поля представляют собой всего 1 или более буквенно-цифровых символов / символов подчеркивания, разделенных 1 или более пробелами. Комментарий — это что угодно после 2 первых полей.
Затем используйте
val s = "name type this comment a comment"
val nameType = """(w )s (w )s (.*)""".r
val res = s match {
case nameType(n, t, c) => print(n,t,c)
case _ => print("NONE")
}
Смотрите онлайн-демонстрацию
Обратите внимание, что нам нужно скомпилировать объект регулярных выражений, обратите внимание на шаблон .r
после регулярных nameType
выражений .
Обратите внимание, что шаблон внутри match
привязан по умолчанию, начало привязки строки ^
может быть опущено.
Кроме того, неплохо добавить case _
, чтобы определить поведение, когда совпадение не найдено.
Комментарии:
1. Это сработало. Спасибо. Не могли бы вы объяснить, что означает ([w)(,] ), пожалуйста?
2. Вы имеете в виду свою
([w)(,] )
часть шаблона? Оно соответствует 1 или более символам, определенным в классе символов: либо символам слов (буквы / цифры / подчеркивание),(
,)
, или,
.