如何使用捕获括号捕获多次出现

时间:2016-09-06 21:36:22

标签: javascript regex

我正在尝试从文本中仅提取关键字符串部分“ ProcessName ”和“ ProcessID ”。 文字可以有更多的关键。 (为了简单起见,我只使用带有两个键的文本) 是否有可能捕获该组的多次出现?

/* 
Maximum absolute difference with i<j<=i+l   --> 
Keeping track of two elements --> 
Max difference and minimum element found so far --> O(n) 
*/

#include <stdio.h>
#include <stdlib.h>

int maxDifference(int arr[] , int size , int l){
    int max = abs(arr[1] - arr[0]) ;
    int min = arr[0] ;
    int minIndex = 0;
    int maxIndex = 1;
    for(int i = 1 ; i < size ; i++){

        if(abs(arr[i] - min) > max){
            maxIndex = i;
            printf("%d maxOuter\n",i);
            if((maxIndex - minIndex) <= l && minIndex < maxIndex){
                printf("%d max\n",i);
                max = arr[i] - min ;
            }
        }

        if(arr[i] <= min){
            printf("%d min\n",i);
            min = arr[i] ;
            minIndex = i ;
        }

    }
    return max;
}

int main(){
    int arr[] = { 
        2, 3, 1, 15, 4, 8, 15, 35, 1, 55, 203, 3, 450, 550, 100, 600}; //3 and 600
    int size = sizeof(arr) / sizeof(arr[0]);
    int l = 5;
    printf("%d" , maxDifference(arr , size , l)) ;
}

当我使用exec时,它只给我一个匹配和支架,所以它似乎没有用。 enter image description here

还尝试了match()但它包含方括号。多次尝试,但似乎无法做到正确。

var text = "[ProcessName] - [ProcessID]";
var regex = new RegExp(/\[[(A-Za-z0-9)]+\]/g);
var result = regex.exec(text);
console.log(result);

enter image description here

2 个答案:

答案 0 :(得分:2)

您错误地定位了圆括号和方括号,从而使捕获组成为字符类的一部分,从而阻止了子匹配的创建。

您需要交换括号的位置:

/\[([a-z0-9]+)]/gi

请参阅下面的regex demo和JS演示。

模式详情

  • \[ - 文字[
  • ([a-z0-9]+) - 第1组捕获一个或多个字母数字
  • ] - 一个字面的结束括号(当它在字符类之外时不需要转义)
  • /gi - 全局和不区分大小写的匹配修饰符([a-z]也将匹配A-Z,处理每个非重叠匹配)

&#13;
&#13;
var re = /\[([a-z0-9]+)]/gi; 
var str = '[ProcessName] - [ProcessID]';
var res = [];
while ((m = re.exec(str)) !== null) {
  res.push(m[1]);
}
console.log(res);
&#13;
&#13;
&#13;

在代码中,我们需要使用RegExp#exec而不是String#match,因为当与具有全局修饰符的正则表达式一起使用时,后者将丢弃所有子匹配(捕获的部分)(请参阅{{3页面)。

答案 1 :(得分:1)

我提出问题后不久,我找到了答案......

var regex = new RegExp(/\[([A-Za-z0-9]+)\]/g);
var matches, output = [];
while (matches = regex.exec(text))
{
    output.push(matches[1]);
}