[英]Can't extract substring from string using regexp
我在这里的第一个帖子“显然”必须与regexp有关(所有新手开发人员的噩梦)
我有一个字符串: 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"
我只想提取这部分Shadowborn Apostle(space)
我使用.match来获取我想要的子字符串: s.match(/^[^\\\\]+/)
不幸的是,MatchData =整个字符串。 我不确定为什么。 任何帮助,将不胜感激。
谢谢!
您的正则表达式^[^\\\\]+
从字符串的开头开始匹配,直到遇到第一个反斜杠(包括空格)为止,因为否定的字符类不匹配反斜杠一次或多次。
也许您可以匹配任何一个或多个非贪婪字符.+?
并使用正向先行 ^.+?(?= \\\\r)
如果要匹配Shadowborn Apostle
然后在文本中使用空格,则还可以在开头使用单词边界\\b
,以确保它不属于较长匹配的一部分,并在结尾处使用正向前行(?= )
断言接下来是空白。
您的正则表达式/^[^\\\\]+/
尝试匹配非反斜杠行首的一个或多个字符。 反斜杠字符(ASCII 92)写为92.chr #=> "\\\\"
,而换行字符(ASCII 13)写为13.chr #=> "\\r"
。 1个
因此,您需要/\\A[^\\r]+/
。
注意,我使用的是字符串锚\\A
的开头 ,而不是行锚^
的开头 。 考虑以下。
"\r\ndog \r".match(/\A[^\r]+/) #=> nil
"\r\ndog \r".match(/^[^\r]+/) #=> #<MatchData "dog ">
使用\\A
还是^
取决于您要实现的目标。 从今以后,我将假设您要的是\\A
(不过,您应该通过编辑问题来阐明这一点。正如所写的,所需的子字符串不必从字符串或一行的开头开始。)
继续,
r = /\A[^\r]+/
m = s.match(r) #=> #<MatchData "Shadowborn Apostle ">
m[0] #=> "Shadowborn Apostle "
或(代替m[0]
):
$& #=> "Shadowborn Apostle "
或者简单地:
s[r] #=> "Shadowborn Apostle "
请参见MatchData#[]和String#[] 。
如果结尾的空格是可选的,那很好。 但是,如果字符串必须以空格结尾,则必须对正则表达式进行一些调整:
r = /\A[^\r]+ /
最后,这是获取不使用正则表达式的所需子字符串的另一种方法:
idx = s.index(" \r")
#=> 18
idx.nil? ? nil : s[0, idx+1]
#=> "Shadowborn Apostle "
idx = "How now, brown cow".index(" \r")
#=> nil
idx.nil? ? nil : s[0,idx+1]
#=> nil
参见String#index 。
1为什么不使用单个反斜杠( /^[^\\]+/
)? 因为Ruby将开始字符类( "["
),所以将'negate'( "^"
)读成一个转义的右括号"\\]"
(解释为字符"]"
)和"+"
。 当下一个字符"/"
终止正则表达式时,她将得出结论,该字符类未关闭,因此引发异常( SyntaxError
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.