如何编写一个正则表达式,可以发现字符串中逗号的错误用法,即:1。非数字,前面没有空格,后面有1个空格; 2.对于数字,如果前面有1-3位数字,后跟3位数字,则允许使用逗号。
一些测试用例:
所以我认为我有一个正则表达式来通过(?![\S\D],[\S\D])
捕获语法错误的单词(捕获非空格/数字后面跟着非空格/数字的逗号),并加入使用另一个正则表达式来捕获语法错误的数字,通过(?!(.?^(?:\d+|\d{1,3}(?:,\d{3}))(?:.\d+)
。把它放在一起让我
preg_match_all("/(?![\S\D],[\S\D])|(?!(.*?^(?:\d+|\d{1,3}(?:,\d{3})*)(?:\.\d+)?$))/",$str,$syntax_result);
..但显然它不起作用。应该怎么做?
===== EDIT =====
感谢Casimir et Hippolyte的回答,我得到了它的工作!我已经更新了他的答案,以处理更多的角落案件。 Idk如果我添加的语法是最有效的,但它现在可以工作。我会更新这个更多的角落案例!
$pattern = <<<'LOD'
~
(?: # this group contains allowed commas
[\w\)]+,((?=[ ][\w\s\(\"]+)|(?=[\s]+)) # comma between words or line break
|
(?<=^|[^\PP,]|[£$\s]) [0-9]{1,3}(?:,[0-9]{3})* (?=[€\s]|[^\PP,]|$) # thousands separator
) (*SKIP) (*FAIL) # make the pattern fail and forbid backtracking
| , # other commas
~mx
LOD;
答案 0 :(得分:3)
它不防水,但这可以让您了解如何继续:
$pattern = <<<'LOD'
~
(?: # this group contains allowed commas
\w+,(?=[ ]\w+) # comma between words
|
(?<=^|[^\PP,]|[£$\s]) [0-9]{1,3}(?:,[0-9]{3})* (?=[€\s]|[^\PP,]|$) # thousands separator
) (*SKIP) (*FAIL) # make the pattern fail and forbid backtracking
| , # other commas
~mx
LOD;
preg_match_all($pattern, $text, $matches, PREG_OFFSET_CAPTURE);
print_r($matches[0]);
我们的想法是从匹配结果中排除允许的逗号以仅获取不正确的逗号。第一个非捕获组包含一种正确情况的黑名单。 (您可以轻松添加其他案例)。
[^\PP,]
表示“除,
之外的所有标点符号”,但您可以使用更明确的允许字符列表替换此字符类,例如:[("']