- 程序有所改变。发帖如还有问题请报告
- 【征集】西西河的经济学,及清流措施,需要主动参与者,『稷下学宫』新认证方式,24年网站打算和努力目标
主题:文问题,关于正则表达式 -- pastebt
对于字符串“1234a5635367312b563789”,怎么只替换掉a和b之间的3
不是特别熟悉,感觉上没有直接的方法。
大概可以
1、用正则表达 先找出 a 开头,b 结束这段字符串。
2、对这段字符串替换。
3、替换后的字符串,用1中的正则表达,替换回去。
用你给出的字符串“1234a5635367312b563789”,替换 a 和 b 之间的"3"为"Z",用 javascript 实现的话,就是
1、 "1234a5635367312b563789".match(/a[^b]+b/i),得到 "a5635367312b"
2、temp="a5635367312b".replace(/3/gi,"Z")
3、"1234a5635367312b563789".replace(/a[^b]+b/i,temp)
不过要是ab段不只一个,你这个办法就不行了,当然最容易想到的就是用ab为界切了字串,然后替换,再拼起来,这个实在是没什么技术含量,我现在就是这么干的,觉得很苯
呵呵,笨办法有时候效率更高。
{string1} a {string2} 3 {string3} b {string4}
然后你再把
{string1} a {string2} {string3} b {string4}
合起来就好了.
各种语言的规矩不一样。
$input=<STDIN>;
chomp($input);
if ($input =~ /^(\d*)(a\d*b)(\d*)$/)
{
$a = $1;
$b = $2;
$c = $3;
$b =~ s/3//g;
$output = $a.$b.$c;
print "$output\n";
}
实际就两个正则表达式
第一个/^(\d*)a(\d*)b(\d*)$/运行完了,对你这个输入$1是1234,$2是a5635367312b,$3是563789
然后把$2赋值给$b,用s/3//g把里面的3都替换掉,一定要加g标示符,代表全局替换,否则只替换第一个3。
最后$output就是1234a5656712b563789
select regexp_replace('123a235bxyza789325b345', 'a([^3]*)3([^b]*)b', 'a\1\2b', 1, 0) result from dual
RESULT
----------------------------------------
123a25bxyza78925b345
这个是ORACLE的SQL正则
你把问题大大的简化了,你自己的例子里ab间只有一个3,而我的里面是多于一个的
没哪种语言是复杂的,呵呵
这样可读行挺好的,也便于别人维护。高效的不一定是最合适的。呵呵
1、a和b之间的
2、3
应该是两次正则吧。
java的
String s = "1234a5635367312b563789";
Pattern pattern = Pattern.compile(".*?[a](.*?)[b].*?");
Matcher matcher = pattern.matcher(s);
if(matcher.find()){
System.out.println(matcher.group(1).replaceAll("3","##"));
}
至少要用两次正则吧。
实际上替换掉a和b之间的3包含两次正则,
1、从字符串里找到a和b之间的串;2、找到3;
而正则好像是没办法做嵌套的。
下面是java的
String s = "1234a5635367312b563789";
Pattern pattern = Pattern.compile(".*?[a](.*?)[b].*?");
Matcher matcher = pattern.matcher(s);
if(matcher.find()){
System.out.println(matcher.group(1).replaceAll("3","##"));
}
呵呵。我想就算是有一步实现的,本质上也应该是一样的,顶多封装一下。
如果有多个a,b出现,是不是还需要考虑greedy matching的问题?