这个问题我已经解决并希望以Q& A风格发布,因为我认为更多人可以使用该解决方案。或者可以改进解决方案,显示它的中断位置。
问题
您想在文本正文中使用引用的字符串和/或注释执行某些操作。你想要提取它们,突出它们,你有什么。但是一些引用的字符串在注释中,有时注释字符在字符串内。字符串分隔符可以转义,注释可以是行注释或阻止注释。当你认为你有一个解决方案时,有人抱怨说,当他的JavaScript中存在正则表达式时,它不起作用。怎么办?
具体示例
var ret = row.match(/'([^']+)'/i); // Get 1st single quoted string's content
if (!ret) return ''; /* return if there's no matches
Otherwise turn into xml: */
var message = '\t<' + ret[1].replace(/\[1]/g, '').replace(/\/@(\w+)/i, ' $1=""') + '></' + ret[1].match(/[A-Z_]\w*/i)[0] + '>';
alert('xml: \'' + message + '\''); /*
alert("xml: '" + message + "'"); // */
var line = prompt('How do line-comments start? (e.g. //)', '//');
// do something with line
这段代码是无稽之谈,但我如何在上述JavaScript的每个案例中做正确的事情?
我发现的唯一接近的是:Comments in string and strings in comments Jan Goyvaerts本人以类似的方式回答。但那个人还没有处理撇号逃脱。
答案 0 :(得分:2)
我已经将正则表达式分解为4行,与图中的4个路径相对应,如果你曾经使用过,请不要在那里保留这些换行符。
(['"])(?:(?!\1|\\).|\\.)*\1|
\/(?![*/])(?:[^\\/]|\\.)+\/[igm]*|
\/\/[^\n]*(?:\n|$)|
\/\*(?:[^*]|\*(?!\/))*\*\/
这段代码抓住了4种类型的“块”,可以包含另外3种。你可以遍历这个并随意做任何你想做的事情或丢弃它,因为它不是你想做的任何事情。
这个特定于JavaScript,因为它是我熟悉的语言。但是你可以很容易地根据你喜欢的语言进行调整。
任何人都会看到此代码中断的方式?
编辑 此后我收到通知,说明了一般模式:https://stackoverflow.com/a/23589204/2684660,neato!