【问题标题】:Javascript RegExp TokenizingJavascript RegExp 标记化
【发布时间】:2012-01-15 21:42:28
【问题描述】:

给定一个字符串,我想使用正则表达式对其进行标记。模式如下:任何字符(包括换行符等),直到“

var patt = /(.)*<(\s)*%/;

但它不会产生预期的结果。我将不胜感激与模式一起解释。

【问题讨论】:

  • 你能告诉我们你想用什么作为标记分隔符吗?这样我们就可以为您提供正则表达式。
  • str.split(/&lt;\s*%/) 不适合您?提供一些示例和期望的结果。
  • 请给出示例输入输出

标签: javascript regex parsing


【解决方案1】:

使用这个:

"some string".split(/.*<\s*%/);

【讨论】:

  • 它不起作用,请在“垃圾邮件牛肉垃圾邮件牛肉”上自己尝试一下。split(/(.)*
  • 我在控制台中对其进行了测试,它正在工作:"this-is+a_test".split(/[\-\+_]/) == ["this", "is", "a", "test"],如果它没有按照您的预期工作,那么您的正则表达式一定是问题所在。
  • 在 JS 正则表达式中,. 不会自动包含 \n。您应该像这样制作模式:/[.\n]*&lt;\s*%/ 或更好,使用多行修饰符:/.*&lt;\s*%/m。此外,您不需要捕获任何东西。
  • 你能告诉我你想用什么来标记吗?这作为标记分隔符没有意义。你的意思是这样的:/&lt;\s*%/m。这会将 "a
  • @MiladNaseri,[.\n] 匹配点或\n,而/m. 没有任何影响。你可能在想/s,但这在 JS 中是缺失的。您可以用于任何字符(包括换行符)的最短内容是 [^]
【解决方案2】:
/^[\s\S]*?< *%/

应该做你想做的。

^ 使其匹配字符串的开头。

[\s\S] 匹配任何字符。从字面上看,它表示任何空格或非空格字符,并且可以解决. 不匹配换行符这一事实。

*? 匹配零个或多个,但匹配其余模式所需的最少。

&lt; 匹配文字 '&lt;'

*(注意空格)匹配零个或多个空格。如果写成[ ]*,这将更具可读性。

% 终于匹配了那个字符。

如果您想匹配整个字符串(即% 应该是字符串中的最后一个字符),那么您可以在最后一个/ 之前放置一个$

【讨论】:

  • 感谢您的回复,但它并没有达到我想要的效果,例如"spam beef&lt;%more spam and beef%&gt;spam beef".split(/^[^&lt;]*&lt; *%/); 结果应该是"spam beef" 还是我遗漏了什么?
  • 你的假设有点不正确,我想要任何字符串,也可以是"&lt;",直到匹配"&lt;",后跟空格(如果有),最后是"%"。例如,"&lt;spam &lt;beef&lt;%more spam and beef%&gt;spam beef".split(/^[^&lt;]*&lt; *%/);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-10
  • 1970-01-01
  • 2010-09-24
  • 2015-11-14
  • 2021-12-02
  • 2011-12-13
  • 2018-03-06
相关资源
最近更新 更多