我在写小Rails的API应用程序,我需要分析字符串以找到具有类似指定的字符串的话:词包括红宝石
假设我的原文为hello mr one two three four nine nineteen
,我想检查on
occurence ,它会产生:one
,如果我在相同的字符串中检查ne t
的发生,它将导致one two
。
我知道有一个丑陋的方式与子字符串,计算位置和解析字符串这种方式,但我认为它可以解决与正则表达式扫描。
请说,如果您需要一些额外的信息,谢谢。
我在写小Rails的API应用程序,我需要分析字符串以找到具有类似指定的字符串的话:词包括红宝石
假设我的原文为hello mr one two three four nine nineteen
,我想检查on
occurence ,它会产生:one
,如果我在相同的字符串中检查ne t
的发生,它将导致one two
。
我知道有一个丑陋的方式与子字符串,计算位置和解析字符串这种方式,但我认为它可以解决与正则表达式扫描。
请说,如果您需要一些额外的信息,谢谢。
▶ str = 'hello mr one two three four nine nineteen'
#⇒ "hello mr one two three four nine nineteen"
▶ re = ->(pattern) { /\p{L}*#{pattern}\p{L}*/ }
▶ str[re.('ne t')]
#⇒ "one two"
▶ str[re.('on')]
#⇒ "one"
Matcher \p{L}
通常比\w
更好,特别是\S
因为它匹配所有UTF-8字母。
要匹配重音字母以及(即合并在“天真”,ï
。)一个应扩大左右的匹配:
▶ re = ->(pattern) { /[\p{L}\p{Mc}]*#{pattern}[\p{L}\p{Mc}]*/ }
请注意,上面的代码将返回第一场比赛。要返回所有比赛,使用的String#[]
String#scan
代替:
▶ str.scan re.('ni')
#⇒ ["nine", "nineteen"]
使用正则表达式:
search = "on"
/\s([^\s]*#{search}.[^\s]*)\s/.match("hello mr one two three four nine nineteen")[1]
# returns "one"
search = "ne t"
/\s([^\s]*#{search}.[^\s]*)\s/.match("hello mr one two three four nine nineteen")[1]
# returns "one two"
它的工作原理是它发现你正在寻找的子字符串,然后组的方式,连接到您的子在第一空白停止两端的任何其他字符两端。
'[^ \ S]'被写为'\ S',和您的解决方案将匹配标点符号,如逗号,顿号等除此之外,它不会匹配字符串开头的字(在给出的例子中是“hello”)和结束字符串的字(“nineteen”)。这就是说,这个解决方案既不稳健也不正确。 – mudasobwa
谢谢你,这是我需要的! – AndreyS
...或放入方法:'def match(str,pattern); STR [/ [\ p {L} \ p {了Mc}] *#{图案} [\ p {L} \ p {了Mc}] * /]; end'。 (ятоже) –
谢谢,卡里,感谢它! – mudasobwa