2013-05-31 234 views
3

I'm工作的一个* .po文件,我正尝试捕捉所有msgid ""msgstr ""之间的文本,而不是真的很幸运,从来没有多行:正则表达式捕捉串,多行

msgid "" 
"%s asdfgh asdsfgf asdfg %s even if you " 
"asdfgdh sentences with no sense. We are not asking translate " 
"Shakespeare's %s Hamlet %s !. %s testing regex %s " 
"don't require specific industry knowledge. enjoying " 
msgstr "" 

什么从来就试过:

var myArray = fileContent.match(/msgid ([""'])(?:(?=(\\?))\2.)*?\1/g); 

感谢您的帮助,我可不是真的与正则表达式:(良好

回答

6

这里是提取所有文本的一种方式:

var match = text.replace(/msgid ""([\s\S]*?)msgstr ""/, "$1"); 

实施例:http://jsfiddle.net/bqk79/

[\s\S]是一个字符类,它可以匹配包括换行符在内的任何字符,所以[\s\S]*?将匹配任意数量的任何字符。在其他语言中,您可以使用sDOTALL标志使.匹配换行符,但JavaScript不支持此操作。

注意,你的正则表达式不作单引号的任何提及,但如果你需要能够msgid ''msgstr ''之间的匹配,以及可以使用以下方法:

var match = text.replace(/msgid (['"]{2})([\s\S]*?)msgstr \1/, "$2"); 
+0

只需我的两天搜索,在这里结束。 – Karthikeyan

2

尝试用这种模式:

/msgid (["']{2})\n([\s\S]*?)\nmsgstr \1/ 

结果是第二个捕获组中,但你可以使更多的简单搭配:第一个捕获组在

/msgid ["']{2}\n([\s\S]*?)\nmsgstr/

+0

's'标志并不在Javascript中存在。 –

+0

@ F.J Glups!我将纠正那 –

1

也许你可以试试这个正则表达式?

msgid ""((?:.|[\n\r])+)msgstr "" 

((?:.|[\n\r])+)这是你的接触组;

(?:.|[\n\r])+这使得匹配.[\n\r]多次,\n\r用于换行和回车。

Tested

2

我意识到这个问题专门询问正则表达式,但是如果可以的话,你应该考虑使用字符串分割来代替。

这里有一个现成的功能:

function extractTextBetween(subject, start, end) { 
    try{ 
     return subject.split(start)[1].split(end)[0]; 
    } catch(e){ 
     console.log("Exception when extracting text", e); 
    } 
} 

http://jsfiddle.net/b33hdh9b/3/