#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 [^)]
Quantifier — Matches 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)
Quantifier — Matches 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)
Ответ №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