正则表达式删除第二个破折号后的一切

时间:2015-02-16 22:55:09

标签: regex

我需要使用Regex过滤大量数据。数据由以下字符串组成:

60166213

60173866-4533

60167323-9439-1259801

NL170-2683-1262201

60174710-1-A12-4

当我需要它们时:

60166213

60173866-4533

60167323-9439

NL170-2683

60174710-1

如何使用正则表达式进行过滤以删除第二个破折号后的所有内容。破折号的数量各不相同,我需要保留所有不包含多个破折号的字符串。

5 个答案:

答案 0 :(得分:5)

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

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

<强> Working demo

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);

答案 1 :(得分: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

答案 2 :(得分:1)

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

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

答案 3 :(得分: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>

答案 4 :(得分:0)

^[^-]*-[^-]*\K.*$

只需使用此项并替换为empty string。请参阅演示。

https://www.regex101.com/r/rK5lU1/38