regexp 您所在的位置:网站首页 string查找字符 regexp

regexp

2023-04-12 05:42| 来源: 网络整理| 查看: 265

a

我想得到:

"123" "213" "312"

图案123仅一次且以任何顺序并且在弦的任何位置

我尝试了很多东西,这似乎更接近,但它仍然离我想要的很远:

grep('[1:3][1:3][1:3]', a, value=TRUE) [1] "113" "313" "2313" "13123"

Wiktor Strib.. 9

我真正需要的是找到包含1 2和3位数字的所有3位数字

然后你可以放心使用

grep('^[123]{3}$', a, value=TRUE) ##=> [1] "112" "123" "113" "212" "223" "213" "312" "323" "313"

正则表达式匹配:

^ - 字符串的开头

[123]{3}- 正好是3个字符1,或者是2或者3

$ - 在字符串末尾断言位置.

此外,如果您只需要唯一值,请使用unique.

如果您不需要多次允许相同的数字,则需要基于Perl的正则表达式:

grep('^(?!.*(.).*\\1)[123]{3}$', a, value=TRUE, perl=T) ## => [1] "123" "213" "312"

请注意双重转义的反向引用.该(?!.*(.).*\\1)负先行将检查字符串是否有捕获组的帮助下没有重复的符号(.)和反向引用,迫使同捕获文本出现的的字符串中.如果找到相同的字符,则不会匹配.请参阅IDEONE演示.

这(?!.*(.).*\\1)是一个负面的预测.它只断言在当前正则表达式引擎位置之后缺少某些模式,即它检查并在没有匹配时返回true,否则返回false.因此,它不会"消耗"字符,它不会"匹配"预测中的模式,正则表达式引擎停留在输入字符串中的相同位置.在这个正则表达式中,它是string(^)的开头.因此,在字符串的开头,正则表达式引擎开始查找.*(任何字符,但换行符,0或更多重复),然后将1个字符捕获(.)到组1中,再次匹配0个或更多字符.*,然后尝试匹配第1组内的相同文本\\1.因此,如果有的话121,因为它会找到两个s ,所以没有匹配,因为前瞻将返回false1.

1> Wiktor Strib..:

我真正需要的是找到包含1 2和3位数字的所有3位数字

然后你可以放心使用

grep('^[123]{3}$', a, value=TRUE) ##=> [1] "112" "123" "113" "212" "223" "213" "312" "323" "313"

正则表达式匹配:

^ - 字符串的开头

[123]{3}- 正好是3个字符1,或者是2或者3

$ - 在字符串末尾断言位置.

此外,如果您只需要唯一值,请使用unique.

如果您不需要多次允许相同的数字,则需要基于Perl的正则表达式:

grep('^(?!.*(.).*\\1)[123]{3}$', a, value=TRUE, perl=T) ## => [1] "123" "213" "312"

请注意双重转义的反向引用.该(?!.*(.).*\\1)负先行将检查字符串是否有捕获组的帮助下没有重复的符号(.)和反向引用,迫使同捕获文本出现的的字符串中.如果找到相同的字符,则不会匹配.请参阅IDEONE演示.

这(?!.*(.).*\\1)是一个负面的预测.它只断言在当前正则表达式引擎位置之后缺少某些模式,即它检查并在没有匹配时返回true,否则返回false.因此,它不会"消耗"字符,它不会"匹配"预测中的模式,正则表达式引擎停留在输入字符串中的相同位置.在这个正则表达式中,它是string(^)的开头.因此,在字符串的开头,正则表达式引擎开始查找.*(任何字符,但换行符,0或更多重复),然后将1个字符捕获(.)到组1中,再次匹配0个或更多字符.*,然后尝试匹配第1组内的相同文本\\1.因此,如果有的话121,因为它会找到两个s ,所以没有匹配,因为前瞻将返回false1.



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有