如何使用正则表达式检查不同字符的数量?

use*_*311 7 regex

我正在尝试创建正则表达式以查找包含最多三个不同字符的所有输入.输入有多长并不重要.

案例:

  • "32 32 32 32 34" - >匹配
  • "MM" - >匹配
  • "" - >匹配
  • "1234" - >不匹配

我已经完成了正则表达式以找到四个或更多不同字符的输入,但现在我需要它以相反的方式...

(.).*(?\1)(.).*(?\1)(?\2)(.).*(?\1)(?\2)(?\3)(.)
Run Code Online (Sandbox Code Playgroud)

主要问题是:如何查看不同字符的数量?

Mik*_*keM 4

以下将匹配最多包含三个不同非空格字符的字符串

^\s*(\S)?(?:\s|\1)*(\S)?(?:\s|\1|\2)*(\S)?(?:\s|\1|\2|\3)*$
Run Code Online (Sandbox Code Playgroud)

(\S)匹配一个非空格字符并捕获它,以便稍后可以使用反向引用(例如 )在正则表达式中引用它\1。使用中?(\S)?,以便字符串可以包含零个、一个、两种或三种类型的非空格字符。

使?:一组非捕获。

正则表达式的第一部分捕获最多三个不同的非空格字符\1, \2, \3, 然后(?:\s|\1|\2|\3)*确保只有这些字符或空格\s可以出现在字符串末尾之前$

在 Javascript 中,一种方法是“使用正则表达式”计算字符串中不同非空格字符的数量:

var str = 'ABC ABC';
var chars = '';

str.replace( /\S/g,  function ( m ) {
    if ( chars.indexOf(m) == -1 ) chars += m;
});

chars.length;    // 3
Run Code Online (Sandbox Code Playgroud)

  • @Bohemian 这是一个常见的约定,就像将字符串放在引号中或将 URL 放在尖括号内一样。没必要迂腐。没有混乱。 (2认同)
  • 使用斜杠的语言:vi、ed、awk、JavaScript、perl、AQL。不使用斜杠的语言:Java、C#、SQL。[“2.某些实用程序和大多数语言使用 /(正斜杠)来开始和结束(去限制或包含)搜索表达式”](http://www.zytrax.com/tech/web/regex.htm#笔记)。无论如何,它不太可能引起混乱。即使你完全不熟悉斜杠约定,也能够弄清楚它。 (2认同)