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

4

我正在处理一个*.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个回答

10
这里有一种方法可以提取所有的文本: ```这是一种提取所有文本的方法:```
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");

我的两天搜索就在这里结束了。 - Karthikeyan

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/


2

尝试使用这个模式:

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

结果在第二个捕获组中,但你可以使用以下方法使其更简单:
/msgid ["']{2}\n([\s\S]*?)\nmsgstr /

在第一个捕获组中


Javascript 中不存在 s 标志。 - Andrew Clark

1

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

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

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

(?:.|[\n\r])+ 它允许多次匹配 .[\n\r],其中 \n\r 是用于换行和回车符。

测试


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接