正则表达式捕获两个字符串,多行之间的字符串

时间:2013-05-31 16:22:38

标签: javascript regex

我在处理一个* .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);

感谢您的帮助,我对正则表达式不太满意:(

4 个答案:

答案 0 :(得分:7)

以下是提取所有文字的一种方法:

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");

答案 1 :(得分:2)

尝试使用此模式:

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

结果是在第二个捕获组中,但您可以使用以下内容更简单:

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

在第一个捕获组

答案 2 :(得分:2)

我意识到这个问题特别要求使用正则表达式,但如果可以的话,你应该考虑使用字符串拆分。

这是一个现成的功能:

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

std::isdigit

答案 3 :(得分:1)

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

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

((?:.|[\n\r])+)这是你的追捕小组;

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

Tested