регулярное выражение scala для сопоставления слов, разделенных табуляцией, со строкой

#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 или более символам, определенным в классе символов: либо символам слов (буквы / цифры / подчеркивание), ( , ) , или , .