Regex: Соответствие выражению только после того, как оно окажется строкой

Я пытаюсь сопоставить только первый экземпляр ":" в строке текста, которая может иметь 1 или более вхождений.

Пример содержания:

title: This is a title: This is a subtitle

Поэтому я хочу сопоставить только ":" после "title"

Я пробовал это:

/(: ?)/

Но он все еще соответствует всем им.

Я знаю, что это должно быть не жадным, используя ? но до сих пор он кажется просто не жадным, но при этом соответствует многочисленным вхождениям в данной строке.

Спасибо за любую помощь :)

ОБНОВЛЕНИЕ 20160823 в 13:50

Ниже приведен пример контента, который я анализирую:

root
    parent
        title: The title with (: ) to be ignored
        text: A line of text

Таким образом, «:», скорее всего, будет предваряться отступом, а слово перед первым «:» может быть любым.

Решение @ 27.01.2017

Итак, это, кажется, работает:

$text = "    title: Page: Website - Tagline";
preg_match("~^(?:[\t ]+)*(?:([\w]+)(?:: ){1})([\s\S]+)$~", $text, $matches);

$matches[1]; // title
$matches[2]; // Page: Website - Tagline

person Luke Watts    schedule 23.08.2016    source источник
comment
Оба двоеточия (:) стоят после заголовка.   -  person 0xCAFEBABE    schedule 23.08.2016
comment
Покажите код, где вы используете регулярное выражение. Или какой инструмент вы используете   -  person Wiktor Stribiżew    schedule 23.08.2016
comment
@Rawing, это не позволит извлечь текст из Text:title: text2 subtitle   -  person Wiktor Stribiżew    schedule 23.08.2016
comment
@ВикторСтрибижев (?m)^(?:(?!: ).)*(: )   -  person Aran-Fey    schedule 23.08.2016
comment
@Rawing Да, закаленный жадный токен - правильный выбор, но жаль, что ОП молчит. Я не люблю эти сложные конструкции. Может быть лучшее решение.   -  person Wiktor Stribiżew    schedule 23.08.2016
comment
Извините, пришлось идти на обед. Поэтому я использую PHP preg_match, если это помогает. Но я проверял на regexr.com.   -  person Luke Watts    schedule 23.08.2016
comment
Чего вы пытаетесь достичь? Укажите ожидаемый результат для ваших входных данных. Сопоставить первый килон и пробелы с preg_match('#:\s*#', $input, $match) не сложно, но это выглядит проблемой XY.   -  person Wiktor Stribiżew    schedule 23.08.2016


Ответы (1)


Попробуй это:

^[^:]*(:).*

Итак, ^ отмечает начало строки,

[^:]* - просматривает строку, пока не увидит двоеточие

(:) - соответствует первому двоеточию в строке

.* (необязательно) - остаток строки

person KseniaK    schedule 23.08.2016
comment
Разве [^:] не исключает все экземпляры : ? - person Luke Watts; 23.08.2016