Это больше вопрос понимания, чем реальная проблема. Ситуация объясняется следующим образом. У меня есть числа с плавающей запятой (например, сумма денег) между двумя кавычками "".
Примеры:
- "1,23"
- "12,23"
- "123,23"
Теперь я хотел сопоставить запятую в этих выражениях. Я построил следующее регулярное выражение, которое у меня работает:
(?<=\"[0-9]|[0-9]{2})(,)(?=[0-9]{2}\")
Часть, которую я не совсем понимаю, - это ретроспективный просмотр в сочетании с или "|". Но давайте разберемся:
(
?<= //Start of the lookbehind
\" //Starting with an escaped quotation mark "
[0-9] //Followed by a digit between 0 and 9
Теперь у меня была проблема, что после кавычки не всегда была одна цифра, как вы можете видеть в примерах 2 и 3. Оператор диапазона, например. {1,3} не работала в ретроспективе. Как я узнал в другом вопросе о переполнении стека.
Поэтому я решил использовать или "|" как предложено здесь:
|[0-9]{2} //Or followed by two digits between 0 and 9
)
Интересно то, что он также соответствует запятой в третьем примере «123,23». Я действительно не понимаю почему. Также я не знаю, почему мне не нужно добавлять начальную кавычку после или "|" снова, потому что я думал, что полный просмотр назад до тех пор, пока оператор или не будет необходимо изменить или повторить, например:
(?<=\"[0-9]|\"[0-9]{2})(,)(?=[0-9]{2}\") //This however does not work at all
Поэтому, как я понимаю, соответствующее регулярное выражение для соответствия всем трем примерам должно выглядеть следующим образом:
(?<=\"[0-9]|\"[0-9]{2}|\"[0-9]{3})(,)(?=[0-9]{2}\")
или хотя бы (если кто-то сможет объяснить пропажу \ "):
(?<=\"[0-9]|[0-9]{2}|[0-9]{3})(,)(?=[0-9]{2}\")
Я надеюсь, что кто-то сможет помочь мне разобраться в ситуации.
// Изменить: если это представляет особый интерес, я использовал это регулярное выражение в обычном текстовом файле в редакторе возвышенного текста 3, чтобы найти запятую и заменить ее.
(?<=\"[0-9]|[0-9]{2})
соответствует всем запятым в этих примерах - person wiktus239   schedule 07.08.2015