2017-02-22 17 views
1

я застрял, пытаясь захватить структуру, как это:Захват между рисунком цифр

1:1 wefeff qwefejä qwefjk 
dfjdf 10:2 jdskjdksdjö 
12:1 qwe qwe: qwertyå 

Я хотел бы, чтобы соответствовать все между цифрами, за которым следует двоеточие, а затем другой набор цифр. Таким образом, ожидаемый результат будет:

match 1 = 1:1 wefeff qwefejä qwefjk dfjdf 
match 2 = 10:2 jdskjdksdjö 
match 3 = 12:1 qwe qwe: qwertyå 

Вот что я пробовал:

\d+\:\d+.+ 

Но это не удается, если есть символы слов, охватывающие две строки.

Я использую механизм регулярных выражений на основе javascript.

+1

Что-то вроде '(? S) \ d +: \ d + (?: (?! \ D +: \ d).) *' Должно работать. –

+0

«.» - любой символ, кроме новых строк, если не установлен модификатор 's'. – chris85

+0

@Wiktor Stribiżew Это действительно работало! Вы хотите получить ответ? Краткое объяснение будет очень полезно, если у вас есть время! – Antti

ответ

1

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

/\d+:\d+(?:(?!\d+:\d)[\s\S])*/g 

\d+:\d+ часть будет соответствовать одна или несколько цифр, двоеточие, одну или несколько цифр и (?:(?!\d+:\d)[\s\S])* будет соответствовать любому символу, ноль или более вхождения, которые не начать последовательность одна или несколько цифр с двоеточием и цифрой. См. this regex demo.

Как закаленный жадный знак является потребляющим ресурсом конструкта, вы можете unroll it в более эффективный шаблон, как

/\d+:\d+\D*(?:\d(?!\d*:\d)\D*)*/g 

См another regex demo.

Теперь () превращается в шаблон, который соответствует строкам линейно:

  • \D* - 0+ нецифровые символы
  • (?: - начало, не захватывая группы соответствие ноль или более последовательности:
    • \d - цифра, которая ...
    • (?!\d*:\d) - не последовало 0+ цифр, : и цифры
    • \D* - 0+ нецифровых символы
  • )* - конец не-захват группы.
0

вы можете использовать или не п-п, но вы должны быть в порядке этот путь

\d+?:\d+? [a-zñA-ZÑ ]* 

Отредактировано:

Если вы хотите включить линии разрыва, вы можете добавить \ п или \ r к набору,

\d+?:\d+? [a-zñA-ZÑ\n ]* 
\d+?:\d+? [a-zñA-ZÑ\r ]* 

Дайте ему попробовать! также протестировали в https://regex101.com/

для более символов: ^ [! а-Za-z0-9 @ # \ $% \^\ & *) (+ = ._-] + $

+0

проверено здесь https://regex101.com/ –

+0

Не делает захват «dfjdf» – Antti

+0

oh ok, did not заметил, что я его отредактировал;) –