正则表达式:匹配字符串直到某些字符

时间:2013-09-03 08:41:27

标签: java regex perl

我正在尝试编写一个正则表达式,该表达式应该显示一个字符串,直到它找到一个空格后面跟一个连字符“ - ”。如果找不到此模式,则应显示整个字符串。字符串中可以有其他空格或连字符。

以下正则表达式适用于大多数字符串值,其中所需部分位于$ 1中:

^([^ ]+[^-]+)( -).+

输入字符串并匹配上述正则表达式的第1组 -

  • 伦敦 - 巴黎东京 - >伦敦 - 巴黎
  • 伦敦马德里 - 巴黎 - 柏林 - 罗马 - 东京 - >伦敦马德里
  • 伦敦巴黎 - 柏林东京 - >伦敦巴黎
  • 伦敦巴黎 - >伦敦巴黎

但是,上述正则表达式与以下情况不符:

  • 伦敦巴黎(某些文字) - 柏林/东京

我尝试了一些正则表达式的变体,也有负向前瞻,但无济于事。

任何帮助将不胜感激! 感谢

编辑: 感谢大家提供有用和解释性建议,但@Vince下面的答案完全符合我的需求。我在

下添加了评论

4 个答案:

答案 0 :(得分:3)

我会使用非贪婪的量词并在它之后进行双重检查,或者是一个空格后跟一个连字符或一行结尾:

#!/usr/bin/env perl

use warnings;
use strict;

while (<DATA>) {
        m/^(.*?)(?:\s+-|$)/ && print "$1\n";
}

__DATA__
London-Paris Tokyo
London Madrid - Paris-Berlin-Rome - Tokyo
London Paris - Berlin Tokyo
London Paris
London Paris (some-text) - berlin/tokyo

它产生:

London-Paris Tokyo
London Madrid
London Paris
London Paris
London Paris (some-text)

答案 1 :(得分:2)

你的正则表达式匹配

start of the line
followed by one or  more non-whitespaces
followed by one or more non-hyphens
followed by whitespace
followed by hyphen
followed by one or more anything

那不是你想要的。你想要

one or more anything
followed by whitespace
followed by hyphen
followed by one or more anything

您可以使用以下正则表达式

来实现此目的
^(.+)\s-.+$

如果你想匹配\s-的第一个组合,你可以使用非贪婪的+?,即

^(.+?)\s-.+$

虽然这只会匹配,但如果字符串中有-。如果你想匹配,即使不是这种情况,你必须使该部分可选。

^(.+?)(\s-.+)?$

现在正则表达式将匹配任何字符串,如果字符串包含-,它将在$ 1之前保存该部分。

答案 2 :(得分:2)

你也可以使用这样的东西(Java代码):

String str = "London Paris";
String substr[] = str.split("\\s+-");
return substr[0];

适用于案例用途:

London-Paris Tokyo --> London-Paris
London Madrid - Paris-Berlin-Rome - Tokyo --> London Madrid
London Paris - Berlin Tokyo --> London Paris
London Paris --> London Paris

编辑:使用ReplaceAll:

str.replaceAll("\\s*-.*", "")

答案 3 :(得分:0)

我认为你的问题倒退了。您正试图在空格/连字符之前找到文本,并在需要做的是在空格/连字符后面找到文本并将其替换为空时将其解压缩。这样,只有正则表达式匹配才会执行操作,否则会保留原始文本。 我不是Perl程序员,但我认为你想要这样的东西:

$string =~ s/ -.*$//;