Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.116.239.195] |
|
Сообщ.
#1
,
|
|
|
Есть вот такое выражение:
.*\d{4}\*{3}(\d{4});(.*):([\d\.]+)(.{3}).;?Остаток:([\d\.]+).(.{3}).;?Место:(.*);?([\d\.]+\s[\d:]+).* Проблема в том что выражение Место:(.*);? может вообще отсутствовать (и тогда вместо .* должна передаваться пустая строка). Вопросительный знак относится только к одному символу, а если поставить круглые скобки, то выражение будет выделено (и занесено в присваиваемую переменную), а этого никак допустить нельзя. Как тогда это описать? |
Сообщ.
#2
,
|
|
|
Jin X
если поставить круглые скобки, то выражение будет выделено (и занесено в присваиваемую переменную), а этого никак допустить нельзя. Присобачить, очевидно, non-capturing group |
Сообщ.
#3
,
|
|
|
А если чуть поподробнее? Как это будет выглядеть?
|
Сообщ.
#4
,
|
|
|
(?:.*) |
Сообщ.
#5
,
|
|
|
Сообщ.
#6
,
|
|
|
Т.е. вот так прокатит? Выделено красным:
.*\d{4}\*{3}(\d{4});(.*):([\d\.]+)(.{3}).;?Остаток:([\d\.]+).(.{3}).;?(?:Место:(.*);?)|()([\d\.]+\s[\d:]+).* Добавлено Т.е. или (?:Место:(.*);?) или () Или где-то косяк есть? |
Сообщ.
#7
,
|
|
|
Цитата ;?(?:Место:(.*);?)|()([ нет, правильней так ;?(?:Место:.*;)?([ |
Сообщ.
#8
,
|
|
|
Adil, ну здесь же у тебя захвата вообще нет!
Если присутствует строка "Место:", то нужно захватить .* (весь текст после него до точки с запятой (если она есть) и цифр - см. первый пост), а если отсутствует, то пустую стрку. |
Сообщ.
#9
,
|
|
|
Jin X
Если присутствует строка "Место:", то нужно захватить .* (весь текст после него до точки с запятой (если она есть) и цифр - см. первый пост), а если отсутствует, то пустую стрку. (?<=Место:)([^;]+;?) |
Сообщ.
#10
,
|
|
|
Rififi, хм... а куда в твоём случае денется текст «Место:»? Ведь между (?<= и предыдущим выражением ничего нет вообще. И [^;]+ тут не в кассу, т.к. + предполагает наличие хотя бы одного символа. А его может и не быть. Хотя, это повод задуматься: а не заменить ли .* во многих местах на [^;]* ??? Хотя, с другой стороны, зачем, если и так всё работает?
А может, можно так сделать? (?:Место:(.*);?|()) (?:Место:)?(.*);? Добавлено Вопрос вот в чём (по варианту Rififi). Если, например, имеется строка "abc1234567890def", то выражение "(a..)(?<=90)(*)" вернёт в первую переменную "abc", а во вторую "def"? Несмотря на то, что 12345678 не описано вообще, а 90 только в (?<=…)? |
Сообщ.
#11
,
|
|
|
Jin X
а куда в твоём случае денется текст «Место:»? Ведь между (?<= и предыдущим выражением ничего нет вообще читай документацию по инструменту которому пользуешься, или переходи на что-нибудь попроще. выражение "(a..)(?<=90)(*)" вернёт в первую переменную "abc", а во вторую "def"? это выражение прежде всего невалидное. но даже если имелось в виду (a..)(?<=90)(.*) то на тексте abc1234567890def совпадений не будет. если у тебя есть - вероятно это поддельный пёрл |
Сообщ.
#12
,
|
|
|
Я не проверял А почему не будет?
|