如何检测字符串行中预期的错误字符串

时间:2017-12-10 18:42:10

标签: php string preg-match

我有一个大字符串示例

newboay1fineboy8badboiy12 boy4andothersfollows ...

我的问题是如何从每个字符串行输出示例中检测到一个不正确的男孩我的预期输出应该是这样的: boay1 boiy12 这是我尝试过的代码:

Tree t2 = Tree.valueOf("(VP (VP (VB manage) (NP (NP (DT the) (JJ entire) (NN life) (NN cycle)) (PP (IN of) (NP (PRP$ your) (NNS APIs))))) (CC and) (VP (VB expose) (NP (PRP$ your) (NNS APIs)) (PP (TO to) (NP (JJ third-party) (NNS developers)))))");
List<Tree> trees = Collections.singletonList(t2);

String s = "@VP $+ (@CONJP|CC $+ @VP)";
TregexPattern p = TregexPattern.compile(s);
for (Tree t : trees) {
  TregexMatcher m = p.matcher(t);
  while (m.findNextMatchingNode()) {
    Tree foundTree = m.getMatch();
    System.out.println(foundTree);
  }
}

但我得不到任何输出。 非常感谢您在我的解决方案中的时间和影响

1 个答案:

答案 0 :(得分:0)

您可以按如下方式修改代码:

$string = "newboay1fineboy8badboiy12 boy4andothersfollows...";
$string = preg_match_all("/(bo\pL+)\d+/", $string, $results,  PREG_SET_ORDER, 0);
foreach($results as $val){
    if($val[1] !== "boy") {
        echo $val[0] . "\n";
    }
}

请参阅PHP demo

要点是匹配bo,然后匹配任意1+个字母,捕获那个部分,然后只匹配1+个数字。请参阅正则表达式(demo):

'~(bo\pL+)\d+~'

<强>详情

  • (bo\pL+) - 第1组:bo和1+个字母
  • \d+ - 1+位。

foreach内,$val[1]包含捕获到第1组的值,如果它不等于boy,则可能会获得访问$val[0]的所有匹配你的if陈述。