我想用数学比较来分割表达式,例如
unlist(strsplit("var<3", "(?=[=<>])", perl = TRUE))
unlist(strsplit("var==5", "(?=[=<>])", perl = TRUE))
unlist(strsplit("var>2", "(?=[=<>])", perl = TRUE))
结果是:
[1] "var" "<" "3"
[1] "var" "=" "=" "5"
[1] "var" ">" "2"
对于上面的第二个例子,我想获得[1] "var" "==" "5"
,因此两个=
应该作为单个元素返回。如何更改正则表达式以实现此目的? (我已经为&#34; ==&#34;尝试了分组和量词,但没有任何效果 - 正则表达式不是我的朋友......)
答案 0 :(得分:9)
您可以使用PCRE正则表达式匹配您需要的子字符串:
==|[<>]|(?:(?!==)[^<>])+
要同时支持!=
,请将其修改为
[!=]=|[<>]|(?:(?![=!]=)[^<>])+
请参阅regex demo。
<强>详情:
==
- 2 =
个招牌|
- 或[<>]
- <
或>
|
- 或(?:(?!==)[^<>])+
- 除<
和>
之外的一个或多个字符[^<>]
(==
)未启动> text <- "Text1==text2<text3><More here"
> res <- regmatches(text, gregexpr("==|[<>]|(?:(?!==)[^<>])+", text, perl=TRUE))
> res
[[1]]
[1] "Text1" "==" "text2" "<" "text3" ">"
[7] "<" "More here"
字符序列(顽固的贪婪令牌)。注意:通过添加更多替代方案并调整缓和的贪婪令牌,可以轻松扩展。
Applicant.where('profile_id = ?', current_user.profile.id).first
OR
Applicant.where(profile_id: current_user.profile.id).first
OR
Applicant.find_by_profile_id(current_user.profile.id)
OR
Applicant.find_by(profile_id: current_user.profile.id)
答案 1 :(得分:6)
在评论中扩展我的想法,仅用于格式化:
\w
[a-zA-Z0-9_]
是\W
而[^a-zA-Z0-9_]
与[[1]]
[1] "var==5" "var" "==" "5"
[[2]]
[1] "var<3" "var" "<" "3"
[[3]]
[1] "var.name>5" "var.name" ">" "5"
相反,我在评论后将其扩展为包含。在字符类中,并且因为R不支持基类正则表达式中的字符类\ w(需要使用perl = TRUE)。
因此正则表达式搜索至少1个\ w和。,然后至少1个不在\ w(匹配运算符),然后至少1个\ w和点。
捕获每个步骤,并给出:
*
如果您的条目可以在运营商周围留出空间,您可以在每个捕获组之间添加<a href="http://your-server.com/ficheAction">Download</a>
,否则操作员捕获将获得它们。
答案 2 :(得分:5)
使用文字&#39;边界(\\b
)并为外观指定2种可能性:
unlist(strsplit("var==5", "(?=(\\b[^a-zA-Z0-9])|(\\b[a-zA-Z0-9]\\b))", perl = TRUE))
[1] "var" "==" "5"
unlist(strsplit("var<3", "(?=(\\b[^a-zA-Z0-9])|(\\b[a-zA-Z0-9]\\b))", perl = TRUE))
[1] "var" "<" "3"
unlist(strsplit("var>2", "(?=(\\b[^a-zA-Z0-9])|(\\b[a-zA-Z0-9]\\b))", perl = TRUE))
[1] "var" ">" "2"
说明:
在&#34; word&#34;的末尾分割。并且,之后,有一个非字母数字字符\\b[^a-zA-Z0-9]
或者它是&#34;字的结尾&#34;之后,有一个字母数字字符。
修改强>
实际上,如果最后的数字是10或更多,上述代码会有意想不到的结果
另一个选择是使用lookbehind
并拆分,之前,有一个非字母字符后跟一个字边,或一个字母字符后跟一个字边:
strsplit("var<20", "(?<=(([^a-zA-Z0-9]\\b)|([a-zA-Z0-9]\\b)))", perl = TRUE)[[1]]
#[1] "var" "<" "20"
strsplit("var==20", "(?<=(([^a-zA-Z0-9]\\b)|([a-zA-Z0-9]\\b)))", perl = TRUE)[[1]]
#[1] "var" "==" "20"
strsplit("var!=5", "(?<=(([^a-zA-Z0-9]\\b)|([a-zA-Z0-9]\\b)))", perl = TRUE)[[1]]
#[1] "var" "!=" "5"
<强> EDIT2:强>
完全窃取@Tensibai方式来定义alphanum(+下划线)/非alphanum字符,上面的regex
可以简化为:"(?<=((\\W\\b)|(\\w\\b)))"