我想匹配字符串:
因此,例如预期的匹配结果将是:
"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
。
答案 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]$
确保最终字符是小写字母字符。