我目前有这个:
^(.+)\(\w+\)|^(.+)\s\(\d{3}\:\d{3}\s\-\s\d{3}\:\d{3}\)
#1只匹配 Foo
#2 Foo 这是正确的
#3匹配 foo ,但它位于第3个数组项[2]中:
3rd array output:
(
[0] => Foo (100:200 - 300:400)
[1] =>
[2] => Foo
)
粗体是我想要匹配的:
Foo(匹配11)此(100:200 - 300:400)结束#1
Foo (not_matched)(100:200 - 300:400)结尾#2
Foo (100:200 - 300:400)结束#3
注意:我没有尝试匹配每行末尾的#1,#2,#3,仅供参考。
如果找到“(100:200 - 300:400)”,那么在它前面得到任何文字,如果“(not_matched)(100:200 - 300:400)”找到,那么在它前面得到任何文字,否则在“(100:200 - 300:400)”之前得到文字
elseif部分“(not_matched)(100:200 - 300:400)”可以被识别,因为它在not_matched和(100:200 - 300:400)的2个圆括号之间只有1个空白区域
修改
这就是我想出的似乎有用的东西,虽然它需要PHP中的一些变通方法才有用。
(.+)\s\(\w+\)\s\(|(.+)\s\(\d{3}\:\d{3}\s\-\s\d{3}\:\d{3}\)
工作示例:http://www.rubular.com/r/NSpGcnyg0p
出于某种原因,它似乎没有保存我的示例,因此您必须将其复制/粘贴。
但正则表达式并没有直接匹配它们,这就是为什么我必须删除php中的空数组元素,以便在[1]元素中得到结果。
任何人都可以在我的正则表达式中看到我做错了吗?
答案 0 :(得分:1)
试试这个:
^.*?(?=\s*(?:\(not_matched\)\s)?\(\d+:\d+\s*-\s*\d+:\d+\))
或者,在PHP中:
if (preg_match(
'/^ # Anchor the match at start of line
.*? # Match any number of characters lazily
(?= # until just before the following:
\s* # - optional whitespace
(?: # - the following group:
\(not_matched\)\s # - literal (not_matched), followed by 1 whitespace
)? # (which is optional)
\(\d+:\d+\s*-\s*\d+:\d+\) # a group like (nnn:mmm - ooo:ppp)
) # End of lookahead assertion
/x',
$subject, $regs)) {
$result = $regs[0];
} else {
$result = "";
}
答案 1 :(得分:0)
这符合您的第二个示例:(.+)(\([\D]+\).+)(\#\d+)
。
这一个将匹配另外两个:(.+)(\([\d\W]+\).+)(\#\d+)
。
答案 2 :(得分:0)
如果我清楚地明白,这应该可以解决问题:
/^(.+)(?:\(not_matched\)\s)?(?:\(\d+:\d+\s-\s\d+:\d+\))\s.+\s(#\d+)$/i
答案 3 :(得分:0)
这似乎有效,但需要一些解决方法才能在php中有用。 (阅读我原来的问题)。
如果其他人没有任何想法,我会选择这个答案......
(.+)\s\(\w+\)\s\(|(.+)\s\(\d{3}\:\d{3}\s\-\s\d{3}\:\d{3}\)
答案 4 :(得分:0)
以下模式将匹配所有内容,结果存储在wanted
键中:
$PATTERN = '/
(?P<wanted>.*?)\s* # everything
(\(.+\s.+\)\s+)? # maybe followed by
(?= # that ends with
\(\d{3}:\d{3}\s-\s\d{3}:\d{3}\)
)
/x';
preg_match($PATTERN, "Foo's (match11) this (100:200 - 300:400) the end", $matches);
var_dump($matches['wanted']);
preg_match($PATTERN, "Foo has (not matched) (100:200 - 300:400) the end", $matches);
var_dump($matches['wanted']);
preg_match($PATTERN, "Foo (100:200 - 300:400) the end", $matches);
var_dump($matches['wanted']);
答案 5 :(得分:0)
Tripple已检查过多个版本。
<?php
$string[] = "Foo's (match11) this (100:200 - 300:400) ";
$string[] = "Foo has (not_matched) (100:200 - 300:400) ";
$string[] = "Foo (100:200 - 300:400) ";
$reg = "~(.*)(\([^\)]*\))?\s\(\d{3}\:\d{3}\s\-\s\d{3}\:\d{3}\)~iU";
foreach ( $string as $s ){
preg_match_all ( $reg, $s, $m , PREG_SET_ORDER);
print "<br />String: ". $s . "<br /><pre>";
print_r ( $m );
print "</pre><br />OR";
print "The String Required is: " . $m[0][1] . "<br />";
}
?>
它正常工作,你可以在
上获得所需的字符串$output = $m[0][1];