2015-02-26 2 views
2

Моего регулярного выражения строка выглядит что-то вродеРегулярного выражения для захвата до первого матча

Вашего заказ # Q-111-111-1111. Сумма счета составляет 100 долларов США.

Как я могу извлечь номер заказа, например, между «#» и «первым».

Q-111-111-1111

Я пробовал:

/#(.*[^.])[.].+?/ 

Но это захват ДО последнего символа точки. Я уверен, мне нужно использовать не жадные соответствия, но я не могу этого сделать.

ответ

4

Вы можете просто использовать следующее регулярное выражение:

#(.*?)\. 

* является жадным - это приводит к тому, двигателю повторить предыдущий маркер как можно чаще, когда вы добавляете ? к .*, это будет ленивого (ungreedy), и не будет соответствовать до первой точки.

Чтобы продемонстрировать это, давайте рассмотрим пример:

  • #(.*)\. применяется на # 12-34.234-3.234. привет мир

    .* будет первым сопрягать все до конца строки (d символов), то он будет пытаться соответствовать точка, но она не существует, поэтому он будет держать возвраты пока она соответствует 4, то точка найдена, строка соответствует #1234.2343.234

  • #(.*?)\. применяется на # 12-34.234-3.234.привет мир

    .*? будет соответствовать только до 4, то точка не будет найдена и будет сравниваться, лень заставляет его прекратить поиски более лексем потреблять

3

Вы могли бы использовать:

/#([^.]*)\./ 

С [^.]* вы подходите последовательность чего-либо, кроме точки (нет необходимости, чтобы избежать точки внутри скобок), за которым следует точка. Результат, который вы хотите, находится в первой группе. Например, в JavaScript:

/(?:#)([^.]*)(?=\.)/.exec("#Q-111-111-1111.")[1] 

возвращается

Q-111-111-1111 

Если вы не хотите использовать группы следующее регулярное выражение может быть применено (не для JavaScript, к сожалению, как он не поддерживает положительный Утверждения назад):

/(?<=#)[^.]*(?=\.)/ 
2

что-то ограничительное будет избежать ложных положительных результатов:

(#[A-Z](-\d+){3}) 

Это одна будет соответствовать строке сборки # с последующей 1 буквой и 3 группы цифр, начиная со -.

Вы можете проверить его here.

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

Ваш заказ # Q-111-111-1111, как было отправлено.

Следуя вашему заказу № Q-111-111-1111, мы никогда не перезвоним вам, и вы больше никогда не увидите свои деньги.

Вы можете быть еще более ограничительный характер и соответствуют только строки с хорошим количеством цифр:

#([A-Z])-(\d{3})-(\d{3})-(\d{4}) 

Хорошая вещь, что каждая соответствующая часть в настоящее время в другой группе.

Вы можете проверить его here.

Смежные вопросы