使用正则表达式检查逗号的用法

时间:2013-12-08 00:24:22

标签: php regex

如何编写一个正则表达式,可以发现字符串中逗号的错误用法,即:1。非数字,前面没有空格,后面有1个空格; 2.对于数字,如果前面有1-3位数字,后跟3位数字,则允许使用逗号。

一些测试用例:

  • 你好,世界
  • 你好,世界=>不正确
  • 你好,世界=>不正确
  • 1,234个世界
  • 1,23个世界=>不正确
  • 1,2345 worlds =>不正确
  • 你好,123个世界=>不正确
  • 你好,1234,567个世界=>不正确
  • 你好,12,34,567个世界=>不正确
  • (新测试案例) hello 1,2和3 worlds
  • (新测试案例)你好$ 1,234世界
  • (新测试案例)您好$ 1,2345 worlds =>不正确
  • (新测试用例) hello“1,234”worlds
  • (新测试用例) hello“1,23”worlds =>不正确

所以我认为我有一个正则表达式来通过(?![\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;

1 个答案:

答案 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,]表示“除,之外的所有标点符号”,但您可以使用更明确的允许字符列表替换此字符类,例如:[("']

您可以找到有关(*SKIP)(*FAIL) herehere的更多信息。