2

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

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

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

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

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

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

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

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

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

编辑: 感谢大家提供有用和解释性的建议,但是下面@Vince 的回答非常适合我的需求。我在下面添加了评论

4

4 回答 4

3

我会使用一个非贪婪的 cuantifier 并在它之后进行仔细检查,无论是空格后跟连字符还是行尾:

#!/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)
于 2013-09-03T08:49:51.443 回答
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-.+$

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

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

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

于 2013-09-03T08:50:14.120 回答
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*-.*", "")
于 2013-09-03T09:28:37.810 回答
0

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

$string =~ s/ -.*$//;
于 2013-09-03T08:52:46.333 回答