[英]Extracting first word of line with regex in Ruby
我有这个文本块:
XQuery programming language
C# programming language
declarative programming
XSLT programming language
Haskell programming language vs F* programming language
我想检索编程语言的名称。
我试过类似的东西
matches = string.scan('/(\w)*\sprogramming language/i')
但这给了我这个:
[]
[]
[]
[]
虽然我想要一个像这样的数组:
['XQuerye','C#','XSLT','Haskell']
我究竟做错了什么?
您必须删除正则表达式分隔符周围的引号/
string.scan(/\S+(?=\sprogramming language)/i)
\\S+
匹配一个或多个非空格字符。 (?=\\sprogramming language)
正向前瞻,断言匹配必须后跟空格和programming language
字符串。 i
modifier使正则表达式引擎执行不区分大小写的匹配。
irb(main):001:0> str = "XQuery programming language
irb(main):002:0" C# programming language
irb(main):003:0" declarative programming
irb(main):004:0" XSLT programming language
irb(main):005:0" Haskell programming language vs F* programming language"
=> "XQuery programming language\nC# programming language\ndeclarative programming\nXSLT programming language\nHaskell programming language vs F* programming language"
irb(main):007:0> str.scan(/\S+(?=\sprogramming language)/i)
=> ["XQuery", "C#", "XSLT", "Haskell", "F*"]
您只需对所拥有的内容进行一些小的更改即可。 我假设你想要的文本总是从一行的开头开始(因为你已经排除了'F*'
)并且与一个或多个空格分开了"programming language"
。
text =<<_
XQuery programming language
C# programming language
declarative programming
XSLT programming language
Haskell programming language vs F* programming language
_
text.scan(/(^.+?)\s+programming language/i).flatten
#=> ["XQuery", "C#", "XSLT", "Haskell"]
笔记:
^
是行首的锚点。 它需要位于捕获组内(^.+)
。 如果我们有^(.+)
,则scan
第三行将返回nil
。 第一个?
在正则表达式中.+
“非贪婪”。 没有它,返回的数组的最后一个元素将是:
“Haskell编程语言与F *”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.