使用正则表达式无法提取指定子串的问题求助
解决你的正则匹配问题
嘿,我来帮你搞定这个正则的小麻烦~
首先,咱们先搞清楚你原来的正则为什么没生效:你写的 /^[^\\]+/ 是想匹配开头所有不是反斜杠的字符,但你字符串里的 \r\n 是实际的换行控制字符,不是字面的 \ 符号,所以这个正则会一路匹配到字符串结尾——因为它根本找不到要排除的反斜杠嘛!
那要提取开头的 Shadowborn Apostle (带末尾空格),有两种简单的方法:
方法1:用正则精准匹配到第一个换行前的内容
你可以用非贪婪匹配加上正向预查,确保只取到第一个 \r\n 之前的部分:
s = "Shadowborn Apostle \r\nCreature — Human Cleric \r\nA deck can have any number Of \r\ncards named Shadowborn Apostle. \r\ne, Sacrifice six creatures named \r\nShadowborn Apostle: Search your \r\nlibrary for a Demon creature card \r\nand put it onto the battlefield. Then \r\nshuffle your library. \r\n" match_result = s.match(/^.*?(?=\r\n)/) puts match_result[0] # 输出:Shadowborn Apostle
这个正则的意思是:
^:从字符串开头开始匹配.*?:非贪婪地匹配任意字符(避免一下子匹配到最后)(?=\r\n):正向预查,当遇到\r\n时就停止匹配
方法2:用字符串分割更直观
其实如果只是取第一行内容,完全不用正则,直接用 split 分割换行符就行:
first_line = s.split("\r\n")[0] puts first_line # 同样输出目标内容
如果你的需求就是精准提取 Shadowborn Apostle 这个固定字符串,也可以直接写 /^Shadowborn Apostle / 来匹配,不过上面两种方法更通用,哪怕换其他卡牌名也能生效~
内容的提问来源于stack exchange,提问作者user9850109
相关产品推荐
相关产品推荐

