发现在一个模式的字符在正则表达式
我试图找到引号中的equals所有出现在一个字符串发现在一个模式的字符在正则表达式
如果我的输入字符串是:
anything='', bob2='age=24, sex=M', dilan=24, noble1='yellow'
我想找到我的字符如下
anything='', bob2='age=24, sex=M', dilan=24, nobel1=24
^ ^
其次通过替换它作为
anything='', bob2='age~24, sex~M', dilan=24, nobel1=24
^ ^
我尝试以下查找所有occurances
'[^',].+?'
但没有工作。
您可以使用这些组与正则表达式。
试试这个代码:
(?<=age)(\=)(\S+\s\w+)(\=)
然后,代替第一和第三组~
,并保持第二组完整:~$2~
演示:https://regex101.com/r/qxR9ty/1
更新
您可以首先使用@Maverick_Mrt建议的否定Lookbehind,然后通过添加|
(例如,)来取消要排除的任何类别。 cat1|cat2
(?<!app|policy_name|dvc_host|sender|sal)\=
谢谢。但有一个问题,我wouldnt能够硬编码“年龄” –
@GeorgeJoseph尝试更新的代码 – Ibrahim
我将无法预测的参数列表像app | policy_name硬编码 –
这是相当困难只是正则表达式来实现您的要求。
我想通过字符来迭代字符串char来实现它。
请检查下面的代码。我已经把评论放在里面了。我使用的是Java,但您可以使用它内部的算法。
public class Main {
public static void main(String args[]){
String input = "param1='', param2='age<b>=</b>24, sex<b>=</b>M', param3=24, param4='yellow'";
char[] arr = input.toCharArray();
boolean close = true;
/**
* Iterate the char array
*/
for(int i = 0;i < arr.length;i++){
if(arr[i] == '\''){
/**
* Ignore the escaped ' char in ''
*/
if(i > 0 && arr[i - 1] == '\\'){
break;
}
/**
* Use close to check whether equal sign is inside the ''
*/
if(close){
close = false;
}else{
close = true;
}
}else if(arr[i] == '='){
if(!close){
arr[i] = '~';
}
}
System.out.print(arr[i]);
}
}
}
谢谢。我应该更具体。使用的语言是Impala SQL, –
试试这个:
(?<!param[\d+])=
而取代本:
〜
细分: 它会寻找任何 '=',并且要查看是否通过PARAM之前[\ d +]或者不是。 如果没有param \ d +,那么它将捕获=符号。
这=将由〜
感谢您接近。我应该已经更具体了实际的字符串可以是这样的app ='',policy_name ='age = 24,sex = M,sal = 300',dvc_host = 24,sender =''。所以我不能硬编码“参数”。 –
您正在使用什么工具/语言所取代?一个可能的答案可能取决于它。你的字符串是否总是格式良好(引号内没有转义序列)? –
使用的语言是Hadoop Impala SQL。引号内没有转义序列 –
引号内不会有任何引号。所以param2 ='年龄= '24',性别='M''将永远不会成为这个问题的合法案例 –