Как мне сопоставить содержимое круглых скобок в регулярном выражении scala

#regex #scala

#регулярное выражение #scala

Вопрос:

Я пытаюсь получить содержимое строки, подобной этой (2.2,3.4) , с помощью регулярного выражения scala, чтобы получить строку, подобную следующей 2.2,3.4

Это даст мне строку с круглыми скобками и все из строки другого текста:

 """(.*?)"""
  

Но, похоже, я не могу найти способ получить только содержимое круглой скобки.

Я пробовал: """((.*?))""" """((.*?))""" и некоторые другие комбинации, но безуспешно.

Я использовал это в прошлом в других приложениях Java: \((.*?)\) , вот почему я подумал, что первая попытка в строке выше """((.*?))""" сработает.

Для моих целей это выглядит примерно так:

 var points = "pointA: (2.12, -3.48), pointB: (2.12, -3.48)"
var parenth_contents = """((.*?))""".r;
val center = parenth_contents.findAllIn(points(0));
var cxy = center.next();   
val cx = cxy.split(",")(0).toDouble;
  

Ответ №1:

Используйте Lookahead и Lookbehind

Вы можете использовать это регулярное выражение:

 (?<=()d .d ,d .d (?=))
  

Или, если вам не нужна точность внутри круглых скобок:

 (?<=()[^)] (?=))
  

Смотрите демонстрацию 1 и демонстрацию 2

Объяснение

  • Просмотр сзади (?<=() утверждает, что предшествует (
  • d .d ,d .d соответствует строке
  • или, в варианте 2, [^)] сопоставляет любые символы, которые не являются закрывающей круглой скобкой
  • Предварительный просмотр (?=)) утверждает, что следующее является )

Ссылка

Комментарии:

1. К вашему сведению, добавлен второй вариант и демонстрация. 🙂

2. Спасибо, @zx81. Возможно, это было неясно из моего исходного сообщения, но мне нужно сначала найти подстроку, содержащую «(что-то)». Например, "pointA: (2.12, -3.48), pointB: (2.12, -3.48)" первое регулярное выражение, которое вы предложили, не находит «( )». По крайней мере, я не могу заставить это работать…

3. Ладно, Гэри, я в замешательстве. В вопросе вы говорите, что хотите найти эту строку: 2.2,3.4 , которая является внутренней строкой, так что это то, что я предоставил. Теперь вы говорите, что хотели бы что-то другое, но мне все еще не ясно, что это такое. Вам нужны только дополнительные круглые скобки: (2.12, -3.48) или также слова вне: pointA: (2.12, -3.48)

4. Возможно, я еще больше запутываю ситуацию. В приведенном выше примере строки "pointA (2.12, -3.48)" я хочу найти строку 2.12, -3.48 . Оглядываясь назад на мой первоначальный пост, я думаю, что именно это я и сказал во многих словах, но я думаю, что добавление примера строки большего размера могло бы немного прояснить ситуацию..

5. Хорошо, тогда зайдите, например, в мою демонстрацию # 2 и поиграйте с внутренней стороной круглых скобок. То, что выделено синим цветом, соответствует. Это не то, что вы хотите?

Ответ №2:

Может быть, попробовать это

 val parenth_contents = "\(([^)] )\)".r
parenth_contents: scala.util.matching.Regex = (([^)] ))

val parenth_contents(r) = "(123, abc)"
r: String = 123, abc
  

Ответ №3:

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

(([^)] ) )

 1st Capturing Group (([^)] ) )
( matches the character ( literally (case sensitive)
Match a single character not present in the list below [^)] 
  QuantifierMatches between one and unlimited times, as many times as possible, giving back as needed (greedy)
) matches the character ) literally (case sensitive)
)  matches the character ) literally (case sensitive)
  QuantifierMatches between one and unlimited times, as many times as possible, giving back as needed (greedy)
Global pattern flags
g modifier: global. All matches (don't return after first match)
m modifier: multi line. Causes ^ and $ to match the begin/end of each line (not only begin/end of string)
  

https://regex101.com/r/MMNRRo/1

Ответ №4:

((.*?)) работает — вам просто нужно извлечь соответствующую группу. Самый простой способ сделать это — использовать unapplySeq метод scala.util.matching.Regex :

 scala> val wrapped = raw"((.*?))".r
wrapped: scala.util.matching.Regex = ((.*?))

val wrapped(r) = "(123,abc)"
r: String = 123,abc
  

Комментарии:

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

2. @downvoter, не могли бы вы объяснить, что я могу сделать, чтобы улучшить ответ?

3. Я не сторонник даунвотера. Но я предполагаю, что они могли заметить небольшую опечатку, не потрудившись сказать об этом. Вероятно, они ожидали чего-то вроде: scala> завернутый val = «\((.*?)\)». r