繁体   English   中英

无法使用正则表达式从字符串中提取子字符串

[英]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 ,以确保它不属于较长匹配的一部分,并在结尾处使用正向前行(?= )断言接下来是空白。

\\bShadowborn Apostle(?= )

演示版

您的正则表达式/^[^\\\\]+/尝试匹配非反斜杠行首的一个或多个字符。 反斜杠字符(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM