我需要使用Regex过滤大量数据。数据由以下字符串组成:
60166213
60173866-4533
60167323-9439-1259801
NL170-2683-1262201
60174710-1-A12-4
当我需要它们时:
60166213
60173866-4533
60167323-9439
NL170-2683
60174710-1
如何使用正则表达式进行过滤以删除第二个破折号后的所有内容。破折号的数量各不相同,我需要保留所有不包含多个破折号的字符串。
答案 0 :(得分:5)
您可以使用这样的简单正则表达式:
(.*?-.*?)-.*
<强> Working demo 强>
您可以查看代码生成器链接不同语言的代码。对于使用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)
答案 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)