如何匹配匹配[a-z _] *但带有非重复符号“_”的字符串

时间:2017-02-17 16:45:27

标签: r regex

我想匹配字符串:

  • 由[a-z_];
  • 组成
  • 不以“_”开头或结尾;
  • 不包括重复的“_”符号。

因此,例如预期的匹配结果将是:

"x"; "x_x" > TRUE
"_x"; "x_"; "_x_"; "x__x" > FALSE

我实现这一点的问题是我可以排除以“_”结尾或以“_”开头的字符串,但我的正则表达式也排除长度为1的字符串。

grepl("^[a-z][a-z_]*[a-z]$", my.string)

我的第二个问题是我不知道如何否定双字符grepl("(_)\\1", my.string)的匹配以及如何将它与我的正则表达式的第一部分集成。

如果可能,我想使用perl = FALSE

执行此操作

3 个答案:

答案 0 :(得分:2)

这似乎正确识别了这些项目:

dat <- c("x" ,"x_x","_x", "x_", "_x_", "x__x")
grep("^_|__|_$", dat, invert=TRUE)
[1] 1 2

所以试试:

!grepl("^_|__|_$", dat)
[1]  TRUE  TRUE FALSE FALSE FALSE FALSE

使用否定和带有三个条件的模式由正则表达式逻辑OR运算符分隔&#34; |&#34;。

答案 1 :(得分:2)

您需要使用以下TRE正则表达式:

grepl("^[a-z]+(?:_[a-z]+)*$", my.string)

请参阅regex demo

<强>详情:

  • ^ - 字符串开头
  • [a-z]+ - 一个或多个ASCII字母
  • (?:_[a-z]+)* - 零个或多个序列(*
    • _ - 下划线
    • [a-z]+ - 一个或多个ASCII字母
  • $ - 字符串结束。

请参阅R demo

my.string <- c("x" ,"x_x", "x_x_x_x_x","_x", "x_", "_x_", "x__x")
grepl("^[a-z]+(?:_[a-z]+)*$", my.string)
## => [1]  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE

答案 2 :(得分:1)

另一个使用分组(*进行计算的正则表达式。

myString <- c("x_", "x", "_x", "x_x_x", "x_x", "x__x")

grepl("^([a-z]_)*[a-z]$", myString)
[1] FALSE  TRUE FALSE  TRUE  TRUE FALSE

因此^([a-z]_)*匹配字符串开头的0个或更多对“[a-z] _”,[a-z]$确保最终字符是小写字母字符。