正则表达式在连字符之前和之后获取文本

时间:2016-05-12 15:11:58

标签: regex regex-lookarounds

我有这个字符串:

"Common Waxbill - Estrilda astrild"

如何为连字符前后的单词写2个单独的正则表达式?我想要的输出是:

"Common Waxbill" 

"Estrilda astrild"

4 个答案:

答案 0 :(得分:6)

This is quite simple:

.*(?= - )     # matches everything before " - "
(?<= - ).*    # matches everything after " - "

See this tutorial on lookaround assertions

答案 1 :(得分:5)

如果你不能使用look-behinds,但是你的字符串总是采用相同的格式并且canout包含的内容超过单个连字符,你可以使用

第一个

^[^-]*[^ -],第二个\w[^-]*$(如果连字符后的第一个非空格不一定是单词字符,则为[^ -][^-]*$

一点解释: ^[^-]*[^ -]匹配字符串的开头(anchor ^),后跟任意数量的字符,不是连字符,最后是不是连字符或空格的字符(只是为了排除最后一个空格)匹配)。

[^ -][^-]*$采用相同的方法,但反过来说,首先匹配一个既不是空格也不是连字符的字符,后跟任意数量的字符,不是连字符,最后是字符串的结尾(anchor { {1}})。 $基本相同,它使用更严格的\w[^-]*$代替\w。这再次用于从匹配中的连字符后排除空格。

答案 2 :(得分:0)

另一种解决方案是在连字符上使用split字符串并删除空白。

答案 3 :(得分:0)

两种替代方法

问题的主要挑战是您需要两个单独的项目。这意味着您的过程依赖于另一种语言。 RegEx本身不解析或分隔字符串; 您所使用的语言将进行实际分离。我的答案可以用PHP获得结果,但是其他语言应该具有可比的解决方案。

如果您只想在问题中完成任务,请,如果您使用的是PHP ...

方法1:explode("-", $list);-> $array[]

如果您的列表超过两个项目,这将很有用:

<?php
// Generate our list
$list = "Common Waxbill - Estrilda astrild";
$item_arr = explode("-", $list);

// Iterate each
foreach($item_arr as $item) {
  echo $item.'<br>';
}

// See what we have
echo '
<pre>Access array directly:</pre>'.
'<pre>'.$item_arr[0].'x <--notice the trailing space</pre>'.
'<pre>'.$item_arr[1].' <--notice the preceding space</pre>';

...您可以清理每个项目,然后使用trim()将它们重新分配到新的阵列中。这将获得您的问题所要求的文本(之前或之后没有多余的空格)...

// Create a workable array
$i=0; // Start our array key counter
foreach($item_arr as $item) {
  $clean_arr[$i++] = trim($item);
}

// See what we have
echo '
<pre>Access after cleaning:</pre>'.
'<pre>'.$clean_arr[0].'x <--no space</pre>'.
'<pre>'.$clean_arr[1].' <--no space</pre>';
?>

输出:

Common Waxbill

Estrilda astrild

Access array directly:

Common Waxbill x <--notice the trailing space

 Estrilda astrild <--notice the preceding space

Access after cleaning:

Common Waxbillx <--no space

Estrilda astrild <--no space

方法2:substr(strrpos())substr(strpos())

如果您的列表中只有两个项目,这将很有用:

<?php
// Generate our list
$list = "Common Waxbill - Estrilda astrild";

// Start splitting
$first_item = trim(substr($list, strrpos($list, '-') + 1));
$second_item = trim(substr($list, 0, strpos($list, '-')));

// See what we have
echo "<pre>substr():</pre>
<pre>$first_item</pre>
<pre>$second_item</pre>
";
?>

输出:

substr():

Estrilda astrild

Common Waxbill

请注意,strrpos()strpos()不同,并且语法也不同。

如果您不使用PHP,但是想以某种其他语言来完成这项工作,而不必依赖RegEx,那么了解该语言将很有帮助。

通常,编程语言附带了一些类似的工具来进行此类工作,这就是人们选择他们所使用的语言的原因之一。