丢弃字符串

时间:2018-01-22 10:10:30

标签: ruby regex string

我有一个特殊的用例,我想丢弃字符串中的所有收缩,只选择单词后跟不包含任何特殊字符的字母。

例如:

string = "~ ASAP ASCII Achilles Ada Stackoverflow James I'd I'll I'm I've"
string.scan(/\b[A-z][a-z]+\b/)

#=> ["Achilles", "Ada", "Stackoverflow", "James", "ll", "ve"] 

注意:它不会丢弃整个单词I'll and I've

有人可以帮助如何丢弃包含收缩的整个单词吗?

2 个答案:

答案 0 :(得分:1)

试试这个正则表达式:

(?:(?<=\s)|(?<=^))[a-zA-Z]+(?=\s|$)

<强>解释

  • (?:(?<=\s)|(?<=^)) - 找到紧跟行开头或空格的位置
  • [a-zA-Z]+ - 匹配1个以上的字母
  • (?=\s|$) - 上面匹配的子字符串后面必须跟一个空格或行尾

Click for Demo

<强>更新

要确保并非所有字母都是大写字母,请使用以下正则表达式:

(?:(?<=\s)|(?<=^))(?=\S*[a-z])[a-zA-Z]+(?=\s|$)

Click for Demo

这里添加的唯一内容是(?=\S*[a-z]),这意味着必须至少有一个小写字母

答案 1 :(得分:0)

我知道已有一个已接受的答案,但我想自己动手:

(?<=\s|^)\w+[a-z]\w*

您可以对其进行测试here。这个正则表达式更短,更有效(从接受的答案中反对315步骤为157步)。

解释相当简单:

  • (?<=\s|^) - 这是一个积极的背后。这意味着我们希望字符串前面有空格字符或字符串的开头。
  • \w+[a-z]\w* - 这意味着我们希望仅由字母组成的字符串(字符)包含至少一个小写字母,从而丢弃整个大写字母。随着背后的积极外观,整个正则表达式最终丢弃包含特殊字符的单词。

注意:此正则表达式不会考虑单字母单词。如果你想要实现这一目标,那么你应该使用\w*[a-z]\w*代替,效率很低。