2016-10-25 176 views
1

我有一个类型的模式anystring_OPCtarget_anystring。 如何验证两个下划线之间的字符串是否为"OPC(target)",并使用正则表达式提取目标,我可以获得一些帮助。正则表达式来拉出2个下划线之间的字符串

想,如果我的字符串为:MP700000001_OPC32_812345643 第一,我需要验证,如果下划线的字符串OPC开始,然后OPC后第二下划线之前获得目标文本。

帮助赞赏!!!

谢谢

回答

1

你可以使用这个表达式:

^[^_]*_OPC\K[^_]+ 

抢匹配的数据。

  • ^[^_]*_OPC将匹配高达第一_任何文本,然后OPCOPC
  • \K将重置所有先前匹配数据
  • [^_]+将匹配数据第二_

RegEx Demo

代码之前:

$str = 'MP700000001_OPC32_812345643'; 

preg_match('/^[^_]*_OPC\K[^_]+/', $str, $matches); 

echo $matches[0] . "\n"; 
//=> 32 
2

用下面的办法来得到所需的 “目标”:

$str = 'MP700000001_OPC32_812345643'; 
$target = ''; 
if (preg_match('/^[^_]+_OPC(\w+)_\w*$/', $str, $matches)) { 
    $target = $matches[1]; 
} 

print_r($target); // 32 
1
_([^_]+)_ 

首先capturegroup是两个下划线之间文本
说明:

_([^_]+)_ 
_    First underscore 
( )   Capture group 
    [^ ]   Everything but this character class 
    _   No underscores 
     +   One or more times 
     _  Closing underscore 
0

如果您使用的是支持先行和回顾后,你可以做一些这样的语言:

Pattern p = Pattern.compile("(?<=_)OPC[0-9]+(?=_)"); 
    Matcher m = p.matcher("MP700000001_OPC32_812345643"); 

    if (m.find()) { 
     String target = m.group(0); 
     System.out.println(target); 
    } 
相关问题