在数学比较的分裂字符传染媒介签到R

时间:2016-11-23 08:15:28

标签: r regex

我想用数学比较来分割表达式,例如

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;尝试了分组和量词,但没有任何效果 - 正则表达式不是我的朋友......)

3 个答案:

答案 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" 字符序列(顽固的贪婪令牌)。

注意:通过添加更多替代方案并调整缓和的贪婪令牌,可以轻松扩展。

R test

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)))"