我正在尝试从文本中仅提取关键字符串部分“ 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时,它只给我一个匹配和支架,所以它似乎没有用。
还尝试了match()但它包含方括号。多次尝试,但似乎无法做到正确。
var text = "[ProcessName] - [ProcessID]";
var regex = new RegExp(/\[[(A-Za-z0-9)]+\]/g);
var result = regex.exec(text);
console.log(result);
答案 0 :(得分:2)
您错误地定位了圆括号和方括号,从而使捕获组成为字符类的一部分,从而阻止了子匹配的创建。
您需要交换括号的位置:
/\[([a-z0-9]+)]/gi
请参阅下面的regex demo和JS演示。
模式详情:
\[
- 文字[
([a-z0-9]+)
- 第1组捕获一个或多个字母数字]
- 一个字面的结束括号(当它在字符类之外时不需要转义)/gi
- 全局和不区分大小写的匹配修饰符([a-z]
也将匹配A-Z
,处理每个非重叠匹配)
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;
在代码中,我们需要使用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]);
}