Рейтинг:
17
Patrice T
Цитата:
Может кто-нибудь помочь?
Принцип регулярных выражений заключается в сопоставлении строк переменных, чтобы объяснить, что вы хотите, вам нужно привести примеры входных данных и соответствующие строки, чтобы сообщить нам, что вы хотите, несколько входных данных, которые будут отклонены, также могут помочь.
Технически это регулярное выражение будет соответствовать тому, что Вы нам сказали:
My super data plan 10gb mobile
Но я боюсь, что это не то, чего ты хочешь.
Ваше объяснение-это не объяснение для людей, которые еще не знают, чего вы хотите.
Покажите несколько примеров, таких как:
Input: "MyInput"
Match: "My" or not match
Condition: Because of ...
Всего лишь несколько интересных ссылок, которые помогут построить и отладить регулярное выражение.
Вот ссылка на документацию по регулярным выражениям:
perlre - perldoc.perl.org[
^]
Вот ссылки на инструменты, помогающие создавать регулярные выражения и отлаживать их:
.Объем тестер регулярное выражение - регулярное выражение шторм[
^]
Регулярное Средство Выражения Эспрессо [
^]
RegExr: Learn, Build, & Test RegEx[
^]
Онлайн-тестер регулярных выражений и отладчик: PHP, PCRE, Python, Golang и JavaScript[
^]
Этот пример показывает вам регулярное выражение в виде красивого графика, который действительно полезен для понимания того, что делает регулярное выражение:
Debuggex: онлайн-тестер визуальных регулярных выражений. JavaScript, Python и PCRE.[
^]
Этот сайт также показывает регулярное выражение в красивом графике, но не может проверить, что соответствует регулярному выражению:
Regexper[
^]
[Обновление]
Силы космического
([a-zA-Z0-9_ ]*\s(\d{1,9},[0-9]*)\s*([0-9]*\s*jul)\s*[-]\s*([0-9]*\s*jul)\s*[0-9]*\s*(\d{2,4},[0-9]*))
^ force space here
csrss
Я обновил свой вопрос
csrss
Во-первых, спасибо вам. Это работает.
Это странно, я тестирую регулярное выражение на сайте regex101, в то время как это работает, когда я открываю его на одном компьютере, на котором я сейчас нахожусь, а не когда открываю на другом ноутбуке - на котором я тестировал. Магия.
Maciej Los
Альтернативно вы можете сопоставлять группы ;) Пожалуйста, смотрите мой ответ.
Рейтинг:
12
Maciej Los
[РЕДАКТИРОВАТЬ]
Если вы хотите дополнительно получить первое появление 99,00...
Для линий:
My super data plan 10gb mobile 99,00 1 jul - 31 jul 2020 99,00
My super data plan 10gb mobile 1 jul - 31 jul 2020 99,00
Попробовать это:
^(?<text>[\w\s]+)(?<num1>[\d]{2,},[\d]{2}){0,}\s(?<fromdate>\d{1,}\s\w{3})\s-\s(?<todate>\d{1,}\s\w{3})\s(?<year>\d{4})\s(?<num2>\d{2,},\d{2})$
Пример - версия 5[
^]
Спички:
1.
Group `text` 0-31 My super data plan 10gb mobile
Group `num1` 31-36 99,00
Group `fromdate` 37-42 1 jul
Group `todate` 45-51 31 jul
Group `year` 52-56 2020
Group `num2` 57-62 99,00
2.
Group `text` 63-93 My super data plan 10gb mobile
Group `fromdate` 94-99 1 jul
Group `todate` 102-108 31 jul
Group `year` 109-113 2020
Group `num2` 114-119 99,00
Как видите, в обоих случаях группа
text
извлекается правильно (до первого появления
99,99
-
num1
или к первому появлению
1 jul
-
fromdate
).
num1
извлекается только в том случае, если существует!
{0,}
- используется для определения количества происшествий для этой группы.
Удачи вам!
csrss
Да, спасибо. Тем не менее пространство необходимо конечно:
^(?P<text>\w.*)\s+(?P<num1>[\d]{2,},[\d]{2})\s(?P<fromdate>\d{1,}\s\w{3})\s-\s(?P<todate>\d{1,}\s\w{3})\s(?P<year>\d{4})\s(?P<num2>\d{2,},\d{2})$
Maciej Los
Нет. Вам не нужно пространство, потому что я использую подстановочные знаки, чтобы захватить пространство тоже ;)
Но (!) это зависит от ваших потребностей :)
csrss
Хммм, я изменил ваше регулярное выражение таким образом:
^(?P<text>\w.*)\s+(?:(?P<num1>[\d]{2,},[\d]{2}))?\s(?P<fromdate>\d{1,}\s\w{3})\s-\s(?P<todate>\d{1,}\s\w{3})\s(?P<year>\d{4})\s(?P<num2>\d{2,},\d{2})$
Потому что я хочу сделать <num1> необязательным. Но пока мне не везет в том, чтобы заставить его работать, потому что если я удалю <num1>, то для строки требуется 2 пробела. Если я сделаю одно пространство необязательным - это не работает. Любая идея, как можно сделать <num1> необязательным?
Maciej Los
^(?P<text>\w.*)(?P<fromdate>\d{1,}\s\w{3})\s-\s(?P<todate>\d{1,}\s\w{3})\s(?P<year>\d{4})\s(?P<num2>\d{2,},\d{2})$
;)
csrss
Да, но в этом случае вы удалили <num1> из регулярного выражения
Maciej Los
Я думал, что "необязательно" означает "не нужна эта группа". Если вы не хотите, чтобы захватить его, попробуйте это:
^(?P<text>\w.*)(?:[\d]{2,},[\d]{2}\s+)(?P<fromdate>\d{1,}\s\w{3})\s-\s(?P<todate>\d{1,}\s\w{3})\s(?P<year>\d{4})\s(?P<num2>\d{2,},\d{2})$
Пример[^]
csrss
Нет, не работает. Если вы используете это регулярное выражение и удаляете сначала 99,00 - ничего не будет сопоставлено.
Maciej Los
Это тоже работает. Пожалуйста, перейдите по ссылке.
Первое появление 99,00 используется, но оно не захватывается.
csrss
Извините, может быть, я выразился неправильно. Допустим, есть 2 строки:
Мой супер тарифный план 10gb mobile 99,00 1 июля - 31 июля 2020 99,00
Мой супер тарифный план 10gb mobile 1 июля - 31 июля 2020 99,00
Я пытаюсь понять, как соответствовать им обоим
Maciej Los
В этом cas вам нужно изменить не захваченную группу, добавив альтернативу (через |
) именно такой образ:
(?:[\d]{2,},[\d]{2}\s+|\s+)
а это значит хватай
-
nn,nn_
или
-
_
;)
Пример v4[
^]
csrss
Спасибо, можно ли захватить <num1> В первом случае, сопоставляя обе строки?
Maciej Los
Извините, я вас не понимаю... Какой результат вы ожидаете получить (для каждой версии строки)?
csrss
Да, наверное, трудно объяснить по сети. Вот ваше регулярное выражение:
^(?P<text>\w.*)(?P<num1>[\d]{2,},[\d]{2}|)\s(?P<fromdate>\d{1,}\s\w{3})\s-\s(?P<todate>\d{1,}\s\w{3})\s(?P<year>\d{4})\s(?P<num2>\d{2,},\d{2})$
И это мои 2 строчки:
Мой супер тарифный план 10gb mobile 99,00 1 июля - 31 июля 2020 99,00
Мой супер тарифный план 10gb mobile 1 июля - 31 июля 2020 99,00
Когда я помещаю все на сайт regex101, с правой стороны, я вижу совпадения. Если у меня есть эти 2 строки, то у меня будет 2 совпадения с приведенным выше регулярным выражением, однако <num1> не будет захвачен. Если я удалю 'или' из группы <num1>, Он будет соответствовать первой строке и захватит <num1>, но не будет соответствовать 2-й строке. Я пытаюсь сопоставить обе строки и захватить <num1> В первом случае, но опустить его во втором случае, поэтому предположим, что у меня будет пустая группа или нет группы - я понятия не имею, как это работает с регулярными выражениями, потому что у меня мало знаний о регулярных выражениях.
csrss
И если ты сделаешь это вот так:
^(?Р<текст> У\Ж.*)(?:[выражение\D]{2,}, [выражение\D]{2}\S+с)?(?P<fromdate>\d{1,}\s\w{3})\s-\s(?P<todate>\d{1,}\s\w{3})\s(?P<year>\d{4})\s(?P<num2>\d{2,},\d{2})$
Тогда 99,00 будет частью <text>
Maciej Los
Нет. Какой язык вы используете (C#, PHP, JavaScript)?
csrss
На данный момент я работаю на сайте regex101, PCRE (PHP) выбран в качестве ароматизатора
Jon McKee
+5! Хорошее регулярное выражение. Я не знал об этом ?P<> синтаксис, так как я в основном делаю C#, который использует только ?<>. КУНЖУТ.
Maciej Los
- Спасибо, Джон. P switch специфичен для PHP. Как вы уже упоминали, в c# ?<group-name> достаточно.
Jon McKee
Я как-то умудрился никогда не использовать PHP, лол. Кстати, разве не было бы замечательно, если бы все следовали стандарту регулярных выражений? Это так раздражает, изучая немного другой синтаксис для каждого языка.
Maciej Los
Скажем так: для каждого языка есть свой стандарт ;)
Jon McKee
*IEEE плачет в углу*