我需要正则表达式匹配每对<p>...<br>
和<p CLASS='extmsg' >...<br>
,以区分聊天对话的部分内容,我以下列格式收到字符串:
<p CLASS='extmsg'>16:30:24 ~ customer@home.com: hello<br>
<p>16:30:14 ~ consultant@company.com: hello to you<br>
<p CLASS='extmsg'>16:30:03 ~ sam.i.am@greeneggs.ham: how are you<br>
<p>03/06/2018 16:29:55 ~ bok.kier@ccc.pl: im fine<br>
我需要它来解析方法。
答案 0 :(得分:2)
不要使用正则表达式解析HTML,请使用正确的XML / HTML解析器。
根据编译理论,无法使用基于finite state machine的正则表达式解析HTML。由于HTML的层次结构,您需要使用pushdown automaton并使用LALR等工具操作YACC语法。
您可以使用以下其中一项:
saxon-lint(我自己的项目)
检查:Using regular expressions with HTML tags
xmllint --html --xpath '//p[@CLASS="extmsg"]/text()' file
答案 1 :(得分:0)
根据Giles Quenot的回答,正则表达不适用于此。使用正确的解析器是一种更好的方法。如果您确实收到所示格式的消息:
一个更简单的想法可能是对行的开头进行字符串匹配。我不知道您使用的是哪种语言,但javascript中的示例可能是:
var inputString = "" // From wherever you get your data
var lines = inputString.split("\n")
for (i = 0; i < lines.length; i++) {
var line = lines[i]
if (line.indexOf("<p CLASS='extmsg'>") == 0) {
console.log("Customer just said: " + line)
} else {
console.log("Representative just said: " + line)
}
}
您也可以修剪<p>
和<br>
标签,因为您已经知道它们有多长。
注意如果数据格式发生变化(例如设计人员进入CSS文件并开始使用BEM notation,将extmsg
更改为message--external
,则会中断},并将message--internal
添加到代表的邮件中。就像你使用正则表达式或解析器一样。处理此问题的最佳方法是让任何提供数据的人为您提供适当的API信息。