#regex
#регулярное выражение
Вопрос:
У меня есть выражение типа
test_abc_HelloWorld_there could be more here.
- Я хотел бы регулярное выражение, которое принимает первое слово, предшествующее первому подчеркиванию. Итак, получаем
"test"
Я пытался [A-Za-z]{1,}_
, но это не сработало.
- Затем я хотел бы получить «abc» или что-нибудь между первыми двумя подчеркиваниями.
2 отдельных регулярных выражения, не объединенных
Любая помощь очень ценится!
Пример:
для 1) регулярное выражение будет соответствовать слову test
для 2) регулярное выражение будет соответствовать слову abc
таким образом, любое другое совпадение в любом случае было бы неправильным. Например, если бы я заменил то, что я сопоставил, тогда я бы получил что-то вроде этого:
для случая 1) сопоставьте «test» и замените «test» на «Goat».
'Goat_abc_HelloWorld_there could be more here'
Мне не нужна замена, я просто хочу совпадение по слову.
Комментарии:
1. можете ли вы привести здесь краткий пример истинного и ложного примера, чтобы мы могли знать, что вам нужно
Ответ №1:
В обоих случаях вы можете использовать утверждения.
^[^_] (?=_)
вы получите все, вплоть до первого подчеркивания строки, и
(?<=_)[^_] (?=_)
будет соответствовать любой строке, расположенной между двумя unserscores.
Комментарии:
1. К сожалению, второе решение не работает, попробуйте его на regextester.com
2. Если используется с приличным механизмом регулярных выражений, это действительно работает! 😉 Regextester построен на Javascript, который не способен обрабатывать утверждения lockbehind. Но это все еще работает с Perl, PHP, Python, Java, .net, Ruby… Поскольку вы не упомянули язык, который вы используете, я просто предположил, что общее регулярное выражение будет в порядке.
3. Если вы хотите, чтобы оно работало с JS, замените его на:
yourString.replace(/(_)[^_] (?=_)/,"$1whatever");
Ответ №2:
Сделайте шаг назад и подумайте, что, возможно, вы переоцениваете решение здесь. В Ruby для этого есть метод разделения, в других языках, вероятно, есть свои эквиваленты
учитывая что-то вроде этого «AAPL_annual_i.xls «, вы могли бы просто сделать это и воспользоваться тем фактом, что ваши данные уже структурированы
string_object = "AAPL_annual_i.xls"
ary = string_object.split("_")
#=> ["AAPL", "annual", "i.xls"]
extension = ary.split(".")[1]
#=> ["xls"]
filetype = ary[3].split(".")[0] #etc
‘ого!
Но если серьезно, я обнаружил, что использовать метод split проще не только для меня, но и для моих коллег, которым приходится читать мой код и понимать, что он делает.
Комментарии:
1. Есть известное высказывание о людях, у которых возникла проблема с программированием, которые используют regexp для ее решения, а затем сталкиваются с двумя проблемами (кто-нибудь, укажите, кто это сказал изначально). Хотя писать регулярные выражения — довольно забавное упражнение, чтение их — не мое представление о веселье.
2. @hyde звучит так, как будто вы говорите, потому что чтение регулярных выражений не доставляет удовольствия, поэтому это не элегантное решение. Или, может быть, вы не … в любом случае, я думаю, что чтение регулярных выражений — это весело, поскольку это более сложная задача, и это заставляет меня задуматься, как такой маленький фрагмент кода и символы делают то, что split делает в нескольких строках кода. Задача — это то, что делает жизнь интересной.
3. @EKet Ну, элегантность — это субъективно. Short — это элегантно, но short может означать «умещается в одной строке» или «умещается на экране». То, что вы понимаете с первого взгляда, элегантно, но это зависит от читателя. Регулярные выражения, безусловно, могут быть элегантными, и часто они являются лучшим решением, но когда в каком-либо коде есть одна строка трудно изменяемого регулярного выражения и 20-строчный комментарий, объясняющий, что он делает, вместо 10 строк кода, отличного от регулярных выражений, это не элегантно, даже если когда-то было интересно написать.
4. дело в том, что для зрителей split() и gsub и другие подобные вещи часто могут служить жизнеспособными заменителями регулярного выражения