繁体   English   中英

在Ruby中使用正则表达式提取行的第一个单词

[英]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使正则表达式引擎执行不区分大小写的匹配。

DEMO

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 *”

  • 在像这样的问题中,你经常可以选择使用捕获组(如此处)或环顾(如@AvinashRaj在他的回答中所做的那样)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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