使用正则表达式来解析字符串,其中分隔符不同

时间:2017-11-07 01:21:42

标签: c# regex

我需要解析以下字符串:

function lookup($symbol)
{
// reject symbols that start with ^
   if (preg_match("/^\^/", $symbol))
   {
       return false;
   }
// reject symbols that contain commas
   if (preg_match("/,/", $symbol))
   {
       return false;
   }
   // body of price history search
$sym = $symbol;
   $yahooURL='https://finance.yahoo.com/quote/'.$sym.'/history?p='.$sym;

// get stock name
$data = file_get_contents($yahooURL);
    $title = preg_match('/<title[^>]*>(.*?)<\/title>/ims', $data, $matches) ? $matches[1] : null;

$title = preg_replace('/[[a-zA-Z0-9\. \| ]* \| /','',$title);
$title = preg_replace('/ Stock \- Yahoo Finance/','',$title);
$name = $title;

// get price data - use simple_html_dom.php (added to /include)
$body=file_get_html($yahooURL);
$tables = $body->find('table');
$dom = new DOMDocument();
$elements[] = null;
$dom->loadHtml($tables[1]); 
$x = new DOMXpath($dom);
$i = 0;
foreach($x->query('//td') as $td){
        $elements[$i] = $td -> textContent." ";
    $i++;
}
$open = floatval($elements[1]); 
$high = floatval($elements[2]);
$low = floatval($elements[3]);
$close = floatval($elements[5]);
$vol = str_replace( ',', '', $elements[6]);
$vol = floatval($vol);
$date = date('Y-m-d');
$datestamp = strtotime($date);
$date = date('Y-m-d',$datestamp);
   // return stock as an associative array
   return [
        "symbol" => $symbol,
        "name" => $name,
        "price" => $close,
        "open" => $open,
        "high" => $high,
        "low" => $low,
        "vol" => $vol,
        "date" => $date
   ];
}

因为这些可以由我想提供的人在合理范围内输入,支持各种间距。

我已经达到以下正则表达式。

<!-- MOCK -->
<!--MOCK-->
<!-- MOCK:SENT;FAIL -->
<!--MOCK:SENT;SUCCESS-->
<!--MOCK:SENT; SUCCESS-->
<!--MOCK:SENT ; SUCCESS-->
<!--MOCK:SENT -->
<!-- MOCK:SENT-->
<!-- MOCK : SENT -->
<!-- MOCK: SENT -->
<!-- MOCK :SENT -->

这适用于除前两个之外的所有上述测试字符串。在前两种情况下,&#34;模式&#34;群体回来是空的,我不明白,因为我认为<!-- *(?<mode>.*?(?=[ \-:])).*: *(?<responses>.*?(?= *-->)) 会收集所有角色,直到它出现在空格,破折号或冒号上。如果我将中间的?<mode>.*?(?=[ \-:])更改为.*: *,那么我将获得所有&#34;模式&#34;价值观,但我失去了所有的回应&#34;值。

我的测试代码是在.NET Fiddle(https://dotnetfiddle.net/HzIXch)中,但这是为了完整性。

.*:? *

1 个答案:

答案 0 :(得分:1)

我认为这里不需要使用前瞻。我就是这样做的:

(?<mode>[A-Z]+)([ \-:]+(?<responses>[A-Z; ]+\b))?

https://dotnetfiddle.net/6xpkt1

关于发布的其他答案以及对您的问题的评论,我完全不同意。 \s与文字空间不同。它包含所有空白字符,如果您只是期望空格,可能会让您遇到麻烦。