Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用正则表达式在字符串中的任意位置查找特定次数的字符_Regex_Grep - Fatal编程技术网

Regex 使用正则表达式在字符串中的任意位置查找特定次数的字符

Regex 使用正则表达式在字符串中的任意位置查找特定次数的字符,regex,grep,Regex,Grep,我正在生成一个字符串的所有可能排列,长度为10个字符,数字为1,2,3 现在我想检查有多少字符串的数字是1三次,2两次和3五次 如果我使用的是egrep,那么正确的正则表达式是什么?您可以使用: 但是,请注意,这不是使用正则表达式解决的完美任务 编辑:既然您说您正在使用egrep,那么您可以改用管道: echo 3121233133 | egrep '(.*1){3}' | egrep '(.*2){2}'| egrep '(.*3){5}' | egrep '^.{10}$' 您可以使用

我正在生成一个字符串的所有可能排列,长度为10个字符,数字为1,2,3

现在我想检查有多少字符串的数字是1三次2两次3五次

如果我使用的是egrep,那么正确的正则表达式是什么?

您可以使用:

但是,请注意,这不是使用正则表达式解决的完美任务


编辑:既然您说您正在使用
egrep
,那么您可以改用管道:

echo 3121233133 | egrep '(.*1){3}' | egrep '(.*2){2}'| egrep '(.*3){5}' | egrep '^.{10}$'
您可以使用:

但是,请注意,这不是使用正则表达式解决的完美任务


编辑:既然您说您正在使用
egrep
,那么您可以改用管道:

echo 3121233133 | egrep '(.*1){3}' | egrep '(.*2){2}'| egrep '(.*3){5}' | egrep '^.{10}$'

这将比正则表达式更快:

input.replace("1", "").length === input.length - 3 &&
input.replace("2", "").length === input.length - 2 &&
input.replace("3", "").length === input.length - 5;

这将比正则表达式更快:

input.replace("1", "").length === input.length - 3 &&
input.replace("2", "").length === input.length - 2 &&
input.replace("3", "").length === input.length - 5;


您使用的是什么语言?在命令行上使用egrep。您能显示您的输入数据并详细说明您的预期输出吗?我有点不清楚。你用什么语言?在命令行上使用egrep。你能显示你的输入数据并详细说明你的预期输出吗?这对我来说有点不清楚。托玛拉克,你用什么语言来回答最重要的问题?@FredLoh把它当作伪代码,只是为了证明这个想法。(它与JavaScript很接近,只是JS在默认情况下不会替换所有出现的子字符串,但我不想让示例比想法本身更复杂。)我对您所做的感到困惑。将1替换为“”,然后剪切长度?方法是删除所有出现的“1”,然后将字符串长度与原始字符串长度-3进行比较。如果它们匹配,我已经删除了3次出现的“1”。托马拉克,你用什么语言来回答最上面的问题?@FredLoh把它当作伪代码,只是为了证明这个想法。(它与JavaScript很接近,只是JS在默认情况下不会替换所有出现的子字符串,但我不想让示例比想法本身更复杂。)我对您所做的感到困惑。将1替换为“”,然后剪切长度?方法是删除所有出现的“1”,然后将字符串长度与原始字符串长度-3进行比较。如果它们匹配,我正好删除了3次出现的“1”。例如,正则表达式不考虑出现3次以上“1”的字符串。@Tomalak,如果按account for,您的意思是不会使匹配失败-是。但是我假设OP的字符串保证有10个字符长,所以所有的
egrep
s不能同时匹配,除非正好有3个。如果不是这样,您可以很容易地添加另一个管道来检查长度是否为10。我指的是
(?=(*1){3})(?=(*2){2})(?=(*3){5})。*
,因为它匹配任何字符串长度。顺便说一句,用
[^1]*
(etc)替换
*
可以提高效率-这将减少内部回溯。您可以锚定正则表达式并附加
{10}
,例如
^(?=(.*1){3})(?=(.*2){2})(?=((.*3){5})。{10}$
。很酷的正则表达式,顺便说一下:-)@Tomalak,正如OP所说的,字符串保证是10个字符长。即使不是这样,您也可以简单地将最后的
*
替换为
^.{10}$
。同意否定的想法。例如,正则表达式不考虑出现3次以上“1”的字符串。@Tomalak,如果按account for,您的意思是不使匹配失败-是。但是我假设OP的字符串保证有10个字符长,所以所有的
egrep
s不能同时匹配,除非正好有3个。如果不是这样,您可以很容易地添加另一个管道来检查长度是否为10。我指的是
(?=(*1){3})(?=(*2){2})(?=(*3){5})。*
,因为它匹配任何字符串长度。顺便说一句,用
[^1]*
(etc)替换
*
可以提高效率-这将减少内部回溯。您可以锚定正则表达式并附加
{10}
,例如
^(?=(.*1){3})(?=(.*2){2})(?=((.*3){5})。{10}$
。很酷的正则表达式,顺便说一下:-)@Tomalak,正如OP所说的,字符串保证是10个字符长。即使不是这样,您也可以简单地将最后的
*
替换为
^.{10}$
。同意否定的想法。