我有一个大字符串(多行)我需要用正则表达式查找数字。我需要的位置总是按照确切的字符顺序进行/跟随,所以我可以使用非捕获匹配来确定我需要的确切数字。我把一个正则表达式放在一起得到这个数字,但它拒绝工作,我无法理解它!
以下是我无法开展的一小部分PHP代码,展示了我需要的基本格式
$sTestData = 'lak sjdhfklsjaf<?kjnsdfh461uihrfkjsn+%5Bmlknsadlfjncas dlk';
$sNumberStripRE = '/.*?(?:sjdhfklsjaf<\\?kjnsdfh)(\\d+)(?:uihrfkjsn\\+%5Bmlknsadlfjncas).*?/gim';
if (preg_match_all($sNumberStripRE, $sTestData, $aMatches))
{
var_dump($aMatches);
}
我需要的数字是461而且这个数字两边的空格之前/之后的字符总是相同的
获得上述正则表达式工作的任何帮助都会很棒!
此链接RegExr: My Reg Ex(对于在线正则表达式创建者和我的正则表达式)表明它应该可以正常工作!
答案 0 :(得分:2)
g
是无效的修饰符,请将其删除。
答案 1 :(得分:1)
关于那个链接,它正在使用哪个正则表达式引擎?内置Flex,因此可能是ActionScript RegExp引擎。它们并非完全相同,每一种都各不相同。
你有许多双反斜杠,它们在这些字符串中应该是单一的。
答案 2 :(得分:0)
$sTestData = 'lak sjdhfklsjaf<?kjnsdfh461uihrfkjsn+%5Bmlknsadlfjncas dlk';
$lDelim = ' sjdhfklsjaf<?kjnsdfh';
$rDelim = 'uihrfkjsn+%5Bmlknsadlfjncas ';
$start = strpos($sTestData, $lDelim) + strlen($lDelim);
$length = strpos($sTestData, $rDelim) - $start;
$number = substr($sTestData, $start, $length);
答案 3 :(得分:0)
使用正则表达式,您可以使用以下代码完成目标:
$string='lak sjdhfklsjaf<?kjnsdfh461uihrfkjsn+%5Bmlknsadlfjncas dlk';
if (preg_match('/(sjdhfklsjaf<\?kjnsdfh)(\d+)(uihrfkjsn\+%5Bmlknsadlfjncas)/', $string, $num_array)) {
$aMatches = $num_array[2];
} else {
$aMatches = "";
}
echo $aMatches;
说明: 我声明了一个名为$ string的变量,并使其等于您最初呈现的变量。您指出感兴趣的数值两侧的字符始终相同。我通过设置等于后引用2的$ aMatches将感兴趣的数值分配给$ aMatches。使用正则表达式中的括号将得到3个匹配:后向引用1将包含数字之前的字符,反向引用2将包含数字你想要的,反向引用3是数字之后的东西。我将$ num_array指定为这些反向引用的变量名称,[2]表示它是第二个反向引用。因此,$ num_array [1]将包含反向引用1中的匹配,而$ num_array [3]将包含反向引用3中的匹配。
以下是我的正则表达式的解释: 匹配下面的正则表达式并将其匹配捕获到反向引用号1«(sjdhfklsjaf&lt; \?kjnsdfh)» 匹配字符“sjdhfklsjaf&lt;”字面意思«sjdhfklsjaf&lt;» 匹配字符“?”字面上«\?» 匹配字符“kjnsdfh”字面上«kjnsdfh» 匹配下面的正则表达式并将其匹配捕获到反向引用号2«(\ d +)» 匹配单个数字0..9«\ d +» 在一次和无限次之间,尽可能多次,根据需要回馈(贪婪)«+» 匹配下面的正则表达式并将其匹配捕获到反向引用号3«(uihrfkjsn +%5Bmlknsadlfjncas)» 匹配字符“uihrfkjsn”字面意思«uihrfkjsn» 匹配字符“+”按字面意思«+» 匹配字符“%5Bmlknsadlfjncas”字面意思«%5Bmlknsadlfjncas»
希望这对你有帮助,祝你好运。 史蒂夫