1

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

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否则它将添加它

我是否过于雄心勃勃

4

5 回答 5

1

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

于 2012-07-24T16:25:42.187 回答
1

您将需要使用某种逻辑。

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

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

于 2012-07-24T17:47:18.313 回答
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 或变体(例如三元运算符 orunless或 Bergi 的答案)之外,可能没有其他办法

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

于 2012-07-24T18:34:28.293 回答
0

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

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

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

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

于 2012-07-24T16:25:54.373 回答
0

不可以。正则表达式只能匹配/测试“字符串”是否存在(或不存在)。然后,您使用的函数可以根据该结果执行某些操作,例如replace可以删除匹配项。

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

如果你想避免 if-else-statement(用于单行或表达式),你可以使用三元运算符。或者,您可以使用返回正确值的 labda 表达式:

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

这匹配字符串“ location”(带有可选逗号)或字符串结尾,如果找到匹配项,则将其替换为空,否则将替换为字符串“ ,location”。我相信您可以将其调整为 Ruby。

于 2012-07-24T18:15:14.417 回答