0

我正在尝试提取满足许多条件的令牌,我正在使用前瞻来实现以下两个条件:

  1. 标记必须是数字/字母数字(即,它们必须至少有一个数字)。它们可以包含一些特殊字符,例如 -'-','/','\','.','_'等,

我想匹配像这样的字符串:165271,,,,agya678yah@123kj*12-

  1. 标记不能有连续的特殊字符,例如:ajh12-&

我不想匹配像这样的字符串:ajh12-&,671%&i^

我对第一个条件使用积极的前瞻:(?=\w*\d\w*)对第二个条件使用消极的前瞻:(?!=[\_\.\:\;\-\\\/\@\+]{2})

我不确定如何结合这两个前瞻条件。

任何的意见都将会有帮助。提前致谢。

编辑 1

我也想提取作为较大字符串一部分的完整标记(即,它们可能存在于字符串中间)。

我想匹配字符串中的所有标记: 165271 agya678 yah@123 kj*12-

并且字符串中没有任何标记(甚至不是标记的一部分):ajh12-& 671%&i^

为了强制正则表达式考虑整个字符串,我也在\b上述正则表达式中使用了:(?=\b\w*\d\w*\b)(?!=\b[\_\.\:\;\-\\\/\@\+]{2}\b)

4

2 回答 2

1

您可以使用

^(?!=.*[_.:;\-\\\/@+*]{2})(?=[^\d\n]*\d)[\w.:;\-\\\/@+*]+$

正则表达式演示

负前瞻(?=[^\d\n]*\d)匹配除数字或换行符以外的任何字符,使用否定字符类,然后匹配数字。

请注意,您还必须添加*并且大多数字符不必在字符类中转义。

使用对比,您还可以将第一个.*转换为否定字符类以防止一些回溯

^(?!=[^_.:;\-\\\/@+*\n][_.:;\-\\\/@+*]{2})(?=[^\d\n]*\d)[\w.:;\-\\\/@+*]+$

编辑

如果没有锚点,您可以在左侧(?<!\S)和右侧使用空白边界(?!\S)

(?<!\S)(?!=\S*[_.:;\-\\\/@+*]{2})(?=[^\d\s]*\d)[\w.:;\-\\\/@+*]+(?!\S)

正则表达式演示

于 2021-09-14T05:57:32.557 回答
1

您可以使用多个前瞻断言来仅捕获符合以下条件的字符串

  1. (?!.*(?:\W|_){2,}.*)- 没有连续的特殊字符和
  2. (?=.*\d.*)- 至少有 1 位数字
^(?!.*(?:\W|_){2,}.*)(?=.*\d.*).*$
于 2021-09-14T05:58:40.353 回答