正则表达式匹配以“ stop”开头的字符串


97

如何创建正则表达式以匹配字符串开头的单词。我们希望匹配stop字符串的开头,任何内容都可以跟随它。

例如,表达式应匹配:

stop
stop random
stopping

谢谢。

Answers:


184

如果您只想匹配以停止使用开头的行

^stop

如果要匹配以单词stop开头的行,然后以空格匹配

^stop\s

或者,如果您希望匹配以单词stop开头但后跟空格或任何其他非单词字符的行,则可以使用(您的正则表达式允许)

^stop\W

另一方面,在大多数正则表达式中,后面的内容与字符串开头的单词匹配(在这些\ w中与\ W的相反)

^\w

如果您的风味没有\ w快捷方式,则可以使用

^[a-zA-Z0-9]+

请注意,第二个习惯用法只会匹配字母和数字,而不会匹配任何符号。

查看您的regex风格手册,以了解允许使用哪些快捷方式以及它们与之完全匹配(以及它们如何处理Unicode)。


27
+1概括您的答案。我希望在Stack Overflow上看到更多这些内容。我认为这使其成为更好的学习资源。
吉姆(Jim)

如何使其不区分大小写,即匹配Stop或stop或sTop?
艾尔顿·加西亚·桑塔纳

取决于您的语言。Perl兼容可以使用I修饰符。/ regex / i .NET RegexOptions.IgnoreCase等
Vinko Vrsalovic

不要忘记^stop\b,这将允许任何边界,包括行尾
Mad Physicist

80

试试这个:

/^stop.*$/

说明:

  • /字符分隔正则表达式(即它们本身不是Regex的一部分)
  • ^表示在行首匹配
  • *后跟*表示可匹配任意字符(。),任意次数(*)
  • $表示到行尾

如果您想在该停止符后加一个空格,则可以像下面这样修改RegEx:

/^stop\s+.*$/
  • \ s表示任何空格字符
  • +跟随\ s表示停用词后必须至少有一个空格字符

注意:还请记住,上面的RegEx要求停用词后面必须有一个空格!因此它将与仅包含以下内容的行不匹配:停止


并非所有语言都使用正斜杠来分隔正则表达式。
JAB

1
@Cat Megex:这正是我添加解释的原因。如果你的语言使用别的东西来界定正则表达式,请用正确的字符/
麦克迪内斯库

1
@Mez是的,这种冗余可以提高清晰度和性能rexegg.com/regex-optimizations.html#anchors
MarredCheese


19

就像@SharadHolani说的那样。这不会匹配以“ stop ” 开头的每个单词

。仅当它在“ 停止前进 ”之类的行的开头时。@Waxo给出了正确的答案:

这一个是好,如果你想匹配与“开头的任何单词停止 ”和包含什么,但字母从A到Z

\bstop[a-zA-Z]*\b

这将匹配所有

停止(1)

随机停止(2)

正在停止(3)

想要停止(4)

停止(5)

/^stop[a-zA-Z]*/

只会匹配(1)直到(3),而不匹配(4)&(5)


8
/stop([a-zA-Z])+/

将匹配任何停用词(stop,stopped,stopping等)

但是,如果您只想在字符串的开头匹配“ stop”

/^stop/

会做:D


2
这将匹配“
Alex B

1
这将与stop123或stop,不匹配。
lostintranslation

7

如果要匹配以“停止”开头的任何内容,包括“停止前进”,“停止”和“停止”,请使用:

^stop

如果要匹配“停止” 一词,然后加上“停止进行”,“停止此”,而不是“停止”而不是“停止”,请使用:

^stop\W

0

我建议不要使用简单的正则表达式方法来解决此问题。太多的单词是其他不相关单词的子字符串,并且您可能会疯狂地尝试过度适应已经提供的更简单的解决方案。

您将需要至少一个幼稚的词干算法(尝试波特词干器;大多数语言都有可用的免费代码)来首先处理文本。将此处理的文本和预处理的文本保留在两个单独的以空格分隔的数组中。确保每个非字母字符在此数组中也都有自己的索引。无论您要过滤的是什么单词列表,都应阻止它们。

下一步将是找到与词干“停止”词列表匹配的数组索引。从未处理的数组中删除那些,然后重新加入空格。

这只是稍微复杂一点,但是将是一种更加可靠的方法。如果您对更面向NLP的方法的价值有任何疑问,则可能需要对集群错误进行一些研究。


0

如果希望单词以“ stop”开头,则可以使用以下模式。“ ^停止。*”

这将匹配以stop开头的单词,然后是任何单词。


1
你不可以只用"^stop"吗?
史蒂芬·劳赫

这取决于。就Java语法而言,我们可以使用Pattern和Matcher对象来使用正则表达式,或者直接将.matches()方法与String对象一起使用。他们的结果不同,如下所示: code String line = "stopped"; String pattern = "^stop"; Pattern r = Pattern.compile(pattern); Matcher m = r.matcher(line); System.out.println(m.find( )); //prints true System.out.println(line.matches(pattern)); //prints false
Manisha Chaurasia

1
仅当行首的单词匹配。如果以“ stop”开头的单词在行的中间或末尾,则此正则表达式将不匹配。@StephenRauch如果省略[az] *,则整个词都不会像“ stopping”那样。在“停止”的情况下,您会得到“停止”,而“ ping”将丢失。
塞达特·基林奇
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.