Я пытаюсь написать регулярное выражение для проверки, если строка соответствует не пустому шаблону CSV с положительными целыми числами, например 34,657547,453,346654
, но и отдельными целыми числами, как 2
или 3943
.Regex для непустого CSV строки положительных целых чисел
Я попытался ^\d+(,\d+)*$
как регулярное выражение (как описан в this SO-question и удалении части, которая позволяет пустую строку), но если я попробовать это на https://regex101.com/ с моим примером вводом 34,657547,453,346654
он говорит мне, что единственный матч будет ,346654
. Если я пытаюсь 34
он говорит, не спички
для моего понимания:
^ // Start of String
\d+ // A digit, at least one time
(...) // Grouping for the next
,\d+ // a comma and at least one digit
* // Repeating the grouping zero to unlimited times
$ // End of String
Так мои тоже вопросы:
- Так что я должен изменить, что я получаю то, что мне нужно?
- Есть ли способ не допускать, чтобы ноль также являлся одной записью? Таким образом,
34,0,354
или0
недействительны. Я думал об использовании[1-9]
вместо\d
в моем регулярном выражении, но это бы вычеркнуло цифры10, 1034
.
В конце концов, я имею в виду сценарий, включая функции, как это:
function validateCSV($string) {
$regEx = "^\d+(,\d+)*$";
// Don't know if this preg_match syntax is right.
// Didn't wrote the script yet because of the failure (?) of my regex in onlinetool
return (preg_match($regEx, $string) > 1) ? true : false;
}
Вы неправильно интерпретируете вывод regex101. Он соответствует всей строке, но ** фиксирует ** только последнее число - последний номер, сопоставляемый символом '(, \ d +)'. Он помещается внутри '()' для повторения, но это также означает, что это группа захвата. Вы можете сделать это группой без захвата, запустив ее с помощью:? - '^ \ d + (?:, \ D +) * $', но в вашем случае это не обязательно. Вы хороши, как есть. – ClasG
@ClasG Я принял ответ Марианоса, но я хотел бы поблагодарить вас за объяснение группы (не) захвата! Поэтому я проголосовал хотя бы за ваш комментарий;) – bish