淘客熙熙

主题:文问题,关于正则表达式 -- pastebt

共:💬26 🌺8 新:
全看树展主题 · 分页首页 上页
/ 2
下页 末页
家园 文问题,关于正则表达式

对于字符串“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为界切了字串,然后替换,再拼起来,这个实在是没什么技术含量,我现在就是这么干的,觉得很苯

家园 不只一个的话,可以循环做。我那个方式每次找到第一个

呵呵,笨办法有时候效率更高。

家园 哪你的3就要改一下了
家园 加标志位

{string1} a {string2} 3 {string3} b {string4}

然后你再把

{string1} a {string2} {string3} b {string4}

合起来就好了.

各种语言的规矩不一样。

家园 先找3,再确定3是不是在ab之间,不知道这样行不?
家园 用perl搞这种事超简单

$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

家园 这个大概要用到Back reference

select regexp_replace('123a235bxyza789325b345', 'a([^3]*)3([^b]*)b', 'a\1\2b', 1, 0) result from dual

RESULT

----------------------------------------

123a25bxyza78925b345

这个是ORACLE的SQL正则

关键词(Tags): #正则表达式
家园 谢谢你的回答,不过

你把问题大大的简化了,你自己的例子里ab间只有一个3,而我的里面是多于一个的

家园 按这个思路

没哪种语言是复杂的,呵呵

家园 可以封装一下

这样可读行挺好的,也便于别人维护。高效的不一定是最合适的。呵呵

家园 java实现

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么?

如果有多个a,b出现,是不是还需要考虑greedy matching的问题?

全看树展主题 · 分页首页 上页
/ 2
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河