我有一个特殊的用例,我想丢弃字符串中的所有收缩,只选择单词后跟不包含任何特殊字符的字母。
例如:
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
有人可以帮助如何丢弃包含收缩的整个单词吗?
答案 0 :(得分:1)
试试这个正则表达式:
(?:(?<=\s)|(?<=^))[a-zA-Z]+(?=\s|$)
<强>解释强>
(?:(?<=\s)|(?<=^))
- 找到紧跟行开头或空格的位置[a-zA-Z]+
- 匹配1个以上的字母(?=\s|$)
- 上面匹配的子字符串后面必须跟一个空格或行尾<强>更新强>
要确保并非所有字母都是大写字母,请使用以下正则表达式:
(?:(?<=\s)|(?<=^))(?=\S*[a-z])[a-zA-Z]+(?=\s|$)
这里添加的唯一内容是(?=\S*[a-z])
,这意味着必须至少有一个小写字母
答案 1 :(得分:0)
我知道已有一个已接受的答案,但我想自己动手:
(?<=\s|^)\w+[a-z]\w*
您可以对其进行测试here。这个正则表达式更短,更有效(从接受的答案中反对315步骤为157步)。
解释相当简单:
(?<=\s|^)
- 这是一个积极的背后。这意味着我们希望字符串前面有空格字符或字符串的开头。\w+[a-z]\w*
- 这意味着我们希望仅由字母组成的字符串(字符)包含至少一个小写字母,从而丢弃整个大写字母。随着背后的积极外观,整个正则表达式最终丢弃包含特殊字符的单词。 注意:此正则表达式不会考虑单字母单词。如果你想要实现这一目标,那么你应该使用\w*[a-z]\w*
代替,效率很低。