正则表达式:删除第二个破折号后面的所有内容

4

我有大量的数据需要使用正则表达式进行过滤。这些数据由以下格式的字符串组成:

60166213

60173866-4533

60167323-9439-1259801

NL170-2683-1262201

60174710-1-A12-4

当我需要它们看起来像这样时:
60166213

60173866-4533

60167323-9439

NL170-2683

60174710-1

我该如何使用正则表达式过滤掉第二个破折号及其后面的所有内容。破折号的数量是不确定的,如果字符串中没有超过一个破折号,则需要保留原样。

常规表达式的类型是什么?你试了什么? - asjo
我已经尝试了下面所有的例子,但都没有成功。我应该提到这一点,但我正在使用使用正则表达式的Universal Analytics。我不认为UA允许使用Lookback,因为它是一个受限制的库。 - madkeen
我不知道'UA'是什么,但是能否不使用正则表达式来完成它呢?类似于如果mystring中'-'的数量大于等于2,则分割并取前两部分这样的操作? - Jasper
可以使用 split 而不是正则表达式来完成此操作。 - sideroxylon
5个回答

6
您可以使用这样一个简单的正则表达式:

例如:

(.*?-.*?)-.*

演示

enter image description here

您可以在代码生成器链接上检查不同语言的代码。 对于使用PCRE(Perl Comptaible RegEx)引擎的php,您可以使用以下代码:

$re = "/(.*?-.*?)-.*/"; 
$str = "60166213\n\n60173866-4533\n\n60167323-9439-1259801\n\nNL170-2683-1262201\n\n60174710-1-A12-4"; 
$subst = "\1"; 

$result = preg_replace($re, $subst, $str);

谢谢这个。看起来很不错,但是似乎不能正常工作 - 我觉得这是因为我正在使用一个不允许回溯的PERL库。你能想到其他的替代方案吗? - madkeen
例如,使用您的建议会删除我需要保留的“60177528-1”的实例。不过奇怪的是,从代码生成器中可以看出它完美地工作。 - madkeen
@madkeen 我提供的示例是针对 PCRE 正则表达式,也就是 Perl 兼容正则表达式。如果你正在使用 Perl,它应该可以工作。 - Federico Piazza
@madkeen,你可以使用锚点来帮助自己,例如:^(.*?-.*?)-.*$ **演示链接**。 - Federico Piazza
你的初始解决方案有效了 - 不知为何,我需要等待一夜才能使过滤器在UA中正常工作。非常感谢,谢谢! - madkeen
@madkeen 太好了,很高兴能帮助。 - Federico Piazza

1
在Python中:
results = [re.sub(r"^([^-]+(?:-[^-]+)?).*$", r"\1", data) for data in datum]

解释
re.compile("""
    ^                # assert beginning of string
    (                # begin capturing group
        [^-]+        #   one or more non-hyphen characters
        (?:          #   begin non-capturing group
            -        #     literal hyphen
            [^-]+    #     followed by one or more non-hyphen characters
        )?           #   end non-capturing group, and allow 1 or 0 of them
    )                # end capturing group
    .*               # match the rest of the string
    $                # assert end of string""", re.X)

DEMO

可以翻译为:

{{链接1:演示}}


谢谢,我应该提到这一点,但我正在使用使用PERL中的正则表达式的通用分析。 - madkeen

1

如果没有指定语言,基本的正则表达式如下。在替换调用中,您可以使用\1$1来引用匹配的组。

([^-\n]+-[^-\n]+)-.*

我正在使用一种通用分析过滤器,我相信它使用PERL库,但它受到限制,不允许回溯。 - madkeen

0

0

我意识到OP正在寻找一个正则表达式的解决方案,但是不使用正则表达式也可以实现这一点。以下提供了一个简单的替代方案,可能在给定的应用程序中有用:

var arr = ['60166213', '60173866-4533', '60167323-9439-1259801', 'NL170-2683-1262201', '60174710-1-A12-4'];
for (var i = 0; i < arr.length; i++) {
  var s = arr[i].split('-');
  if (s[1]) {
    var o = s[0] + ' - ' + s[1];
  } else {
    var o = s[0];
  }
  $('#output').append(o + '<br>');
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="output"></div>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接