正则表达式可以实现

时间:2012-07-24 16:22:22

标签: ruby regex regex-negation

我太野心勃勃了,或者有办法做到这一点

to add a string 如果不存在?

remove a the same string 如果存在?

使用Regex执行所有操作并避免使用if else语句

这是一个例子

我有字符串

"admin,artist,location_manager,event_manager"

对于上述条件,可以添加或删除子字符串 location_manager

基本上我正在寻找避免if else语句并在正则表达式中明确地做所有这些

"admin,artist,location_manager,event_manager".test(/some_regex/)

如果存在,some_regex将从字符串中删除 location_manager ,否则会添加

我是否已超越野心

5 个答案:

答案 0 :(得分:1)

正则表达式实际上不会添加或删除我所知道的任何语言的任何内容。它只是用来匹配。您必须使用其他语言构造(例如,基于正则表达式的替换函数)来实现此功能。它可能有助于提及您的特定语言,以便从这些用户那里获得帮助。

答案 1 :(得分:1)

你需要使用某种逻辑。

str += ',location_manager' unless str.gsub!(/location_manager,/,'')

我假设如果它不存在,则将其附加到字符串的末尾

答案 2 :(得分:1)

这是一种有条不紊的解决方案。它不使用正则表达式,但它也不使用任何if / else语句。它比学术上更有学术价值。

假设:您的字符串是逗号分隔的标题列表,这些是唯一的集合(没有重复),并且该顺序无关紧要:

titles = Set.new(str.split(','))
#=> #<Set: {"admin", "artist", "location_manager", "event_manager"}> 
titles_to_toggle = ["location_manager"]
#=> ["location_manager"]

titles ^= titles_to_toggle
#=> #<Set: {"admin", "artist", "event_manager"}>
titles ^= titles_to_toggle
#=> #<Set: {"location_manager", "admin", "artist", "event_manager"}>

titles.to_a.join(",")
#=> "location_manager,admin,artist,event_manager"

所有这些都假定您使用字符串作为一种集合。如果是这样,你应该只使用一套。如果没有,并且你实际上需要字符串操作函数来操作它,除了使用if-else或变体(如三元运算符,或unless或Bergi的答案)之外,可能无法解决。 p>

另外值得注意的是正则表达式作为解决方案:确保您考虑边缘情况。如果'location_manager'位于字符串的中间,您是否会删除无关的逗号?如果它位于字符串的开头或结尾,你会正确删除逗号吗?在添加逗号时是否会正确添加逗号?由于这些原因,将集合视为集合或数组而不是字符串更有意义。

答案 3 :(得分:0)

删除与模式匹配的内容非常简单:

(admin,?|artist,?|location_manager,?|event_manager,?)

然后选择字符串来替换匹配 - 在你的情况下是一个空字符串 - 并将所有内容传递给replace方法。

您建议的其他操作仅使用正则表达式更难实现。也许有人知道更好的答案

答案 4 :(得分:0)

没有。正则表达式只能匹配/测试&#34;字符串&#34;存在(或不存在)。然后,您使用的功能可以根据该结果执行某些操作,例如replace可以删除匹配项。

然而,你想要做两个动作(每个动作可以用正则表达式完成),如果存在则删除,如果不存在则添加。你不能按顺序执行它们,因为它们重叠 - 你需要执行其中一个。这就是if-else结构(或三元运算符)发挥作用的地方,如果没有包含它们的库/本机函数来完成这项工作,则需要它们。我怀疑Ruby中有一个。

如果要避免使用if-else语句(对于单行或表达式),可以使用三元运算符。或者,您可以use a labda expression返回正确的值:

# kind of pseudo code
string.replace(/location,?|$/, function($0) return $0 ? "" : ",location" )

匹配字符串&#34; location&#34; (使用可选的逗号)或字符串结尾,如果找到匹配项或字符串&#34; ,location&#34;则将其替换为空。除此以外。我确信你可以适应Ruby。