2015-02-10 101 views
2

我在Ruby中遇到了一些正则表达式的问题。情况是这样的: 输入文本:Ruby删除部分字符串

"NU POSTA aşa ceva pe Facebook! „Prostia se plăteşte” 
Publicat la: 10.02.2015 10:20 Ultima actualizare: 10.02.2015 10:35 
Adresa de e-mail la care vrei sa primesti STIREA atunci cand se intampla 
Abonează-te 
---- Here is some usefull text --- 
Abonează-te 
× Citeşte mai mult » 
Adauga un comentariu" 

我需要一个正则表达式女巫可以提取“Abonează-TE”字之间的唯一有用的文本。

我试过这个result = result.gsub(/^[.]{*}\nAbonează-te/, '')将文本从字符串的开头删除到'Abonează-te'这个词,但这不起作用。我不知道如何解决这种情况。你可以帮我吗?

回答

2

而不是使用正则表达式,你可以使用String#split,然后采取第二部分:

s = "NU POSTA aşa ceva pe Facebook! „Prostia se plăteşte” 
Publicat la: 10.02.2015 10:20 Ultima actualizare: 10.02.2015 10:35 
Adresa de e-mail la care vrei sa primesti STIREA atunci cand se intampla 
Abonează-te 
---- Here is some usefull text --- 
Abonează-te 
× Citeşte mai mult » 
Adauga un comentariu" 
s.split('Abonează-te', 3)[1].strip # 3: at most 3 parts 
# => "---- Here is some usefull text ---" 

UPDATE

如果你想获得多个匹配:

s = "NU 
Abonează-te 
-- Here's some 
Abonează-te 
text -- 
Abonează-te 
comentariu" 
s.split('Abonează-te')[1..-2].map(&:strip) 
# => ["-- Here's some", "text --"] 
+0

谢谢!是一个有趣的选择。 – kitz 2015-02-10 16:19:48

+1

@kitz这不是一种选择。这是正确的路要走。为了达到这个目的,使用'scan'或'gsub'的其他答案在策略上是错误的。 – sawa 2015-02-10 16:52:21

+1

如果's =“NUAbonează-te \ n--下面是一些Abonează-te文本 - \ nAaAazaz-te comentariu”'? – 2015-02-10 17:54:34

2

您可以使用string.scan函数。您不需要去寻找想要提取特定文本的string.gsub函数。

> s = "NU POSTA aşa ceva pe Facebook! „Prostia se plăteşte” 
" Publicat la: 10.02.2015 10:20 Ultima actualizare: 10.02.2015 10:35 
" Adresa de e-mail la care vrei sa primesti STIREA atunci cand se intampla 
" Abonează-te 
" ---- Here is some usefull text --- 
" Abonează-te 
" × Citeşte mai mult » 
" Adauga un comentariu" 
=> "NU POSTA aşa ceva pe Facebook! „Prostia se plăteşte”\nPublicat la: 10.02.2015 10:20 Ultima actualizare: 10.02.2015 10:35\nAdresa de e-mail la care vrei sa primesti STIREA atunci cand se intampla\nAbonează-te\n---- Here is some usefull text --- \nAbonează-te\n× Citeşte mai mult »\nAdauga un comentariu" 
irb(main):010:0> s.scan(/(?<=Abonează-te\n)[\s\S]*?(?=\nAbonează-te)/) 
=> ["---- Here is some usefull text --- "] 

删除换行符\n如果有必要的话可以在lookaround中出现字符。 [\s\S]*?会对空格或非空格字符进行零次或多次非贪婪匹配。

DEMO

+0

谢谢!它像一个魅力! – kitz 2015-02-10 16:19:20

+0

好,但是你可以通过添加一个捕获组并替换包含锚的非捕获组的替代方案来加强它吗? (读者:Ruby的lookarounds不能包含可变长度的匹配,如果不包含juicy位之前和之后的整个文本,则需要使用锚。)一个小的请求:你能否删除IRB提示?他们冒犯了我的感情。 – 2015-02-10 17:04:46

+0

你的意思是's.scan(/Abonează-te。* \ n([\ s \ S] *?)\nAbonează-te /)[0]'。啊,我忘记了。 @CarySwoveland请检查我的编辑是对还是错。 – 2015-02-10 17:08:58

1

您的正则表达式语法不正确.在字符类内部意思是直接匹配一个点,并且{*}匹配开头大括号“零个或多个”时间,后跟大括号大括号。

您可以匹配而不是替换此处。

s.match(/Abonează-te(.*?)Abonează-te/m)[1].strip()