其他教程

其他教程

Products

当前位置:首页 > 其他教程 >

求正则表达式高手

GG网络技术分享 2025-03-18 16:15 1


问题描述:

求一条正则表达式,要求: 匹配前面有奇数个字符a的字符zhu, 如\'aaxxzaddzhu\'可匹配, \'aaxxzddzhu\'不匹配,\'azhu\'匹配, 还请大神们帮忙啊。

网友观点:

楼主试试这个正则吧,经我测试,完全满足你的要求(改自 Eastsun 提供的更正则):

(?<=^([^a]*a[^a]*)(a[^a]*a[^a]*)*)zhu$

不会。。。写个方法

1、截取‘zhu’前面字符串
2、判断截取的字符串包含的‘a’是否是奇数
搞定~

出现\\\"aaabzhua\\\" 字符串不是\\\"zhu\\\"结尾的需要考虑吗?
出现\\\"aazhuabbbzzhu\\\" 字符串中有多个\\\"zhu\\\"怎么取舍?

如果是以\\\"zhu\\\"结尾的字符串判断其中\\\"a\\\"的个数

[code=\\\"js\\\"]var array=\\\"dzhu\\\".match(/[a]/ig);[/code]

^([a-z][a-z])*[a-z]zhu
只能是从开始位置匹配

使用环视功能。
满足你要求的正则为 \\\"(?<=a+)\\\"

环视功能说明:
(?<=) 肯定逆序环视 子表达式能够匹配左侧文本(环视开始的位置是从当前匹配成功的位置算起)
(?<!) 否定逆序环视 子表达式不能匹配左侧方本
(?=) 肯定顺序环视 子表达式能够匹配右侧文本
(?!) 否定顺序环视 子表达式不能匹配右侧文本

正则写错了,应该是\\\"(?<=a+)zhu\\\"

呃,楼主可以试试这个:\\\"([^a]*a[^a]*)(a[^a]*a[^a]*)*zhu\\\"

下面的java程序可以用来测试,先贴出测试结果:
[quote]future$ java RegexTest
Input: aaxxzaddzhu
yes
Input: aaxxzddzhu
no
Input: azhu
yes
Input: aaazhu
yes
Input: aaaaaaazhu
yes
Input: azazazazazhu
yes
Input: azazazazhu
no[/quote]

[code=\\\"java\\\"]import java.util.*;
import java.util.regex.*;

public class RegexTest {
public static void main(String[] args) {
String regex = \\\"([^a]*a[^a]*)(a[^a]*a[^a]*)*zhu\\\";
Scanner sca = new Scanner(System.in);
while(true) {
System.out.printf(\\\"Input: \\\");
String line = sca.nextLine();
System.out.printf(Pattern.matches(regex,line)?\\\"yes\\n\\\":\\\"no\\n\\\");
}
}
}[/code]

我觉得你这个要求又不是通用的正则匹配。不如直接得到char数组。
for循环。加a数量统计。发现zhu,计算此时的统计值。是基数得到。
不知道aaazhuaaazhu后面的zhu算不算。
这时就是清空统计的问题。
这样的时间复杂度也是最低的。毕竟是个特殊匹配。又不需要回溯的。
我觉得这个做法比你正则来的要好。

应该能满足你的需求了,给分吧哈哈!
[code=\\\"java\\\"]package com.demo.gae.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

String regex=\\\"(((aa)+)|(a+))[^a]*\\\";

String content=\\\"aaxxzddzhuarraaaaabbbbbaaacccaaaagggg\\\";

StringBuffer sb = new StringBuffer();

Pattern pattern = Pattern.compile(regex,Pattern.DOTALL);

Matcher matcher = pattern.matcher(content);

while(matcher.find()) {

String data=matcher.group(4);

if(data!=null){

matcher.appendReplacement(sb,data+\\\"---\\\");

//matcher.appendReplacement(sb,matcher.group().replaceAll(data, \\\"---\\\"));

}

}

matcher.appendTail(sb);

content= sb.toString();

System.out.println(content);

}

}
[/code]

多次测试通过
[code=\\\"javascript\\\"]
var str1 = \'aaxxzaddzhu\';
var str2 = \'aaxxzddzhu\';
var str3 = \'xxzdadzhu\';
var reg = /^([^a]*a[^a]*)([^a]*a[^a]*a[^a]*)*zhu/;
console.info(reg.test(str1)); // true
console.info(reg.test(str2)); // false
console.info(reg.test(str3)); // true
[/code]

正则验证:
[code=\\\"javascript\\\"]
var str1 = \'aaxxzaddzhu\';

var str2 = \'aaxxzddzhu\';

var str3 = \'xxzdadzhu\';

var reg = /^([^a]*a[^a]*)([^a]*a[^a]*a[^a]*)*(zhu)/;

console.info(reg.test(str1)); // true

console.info(reg.test(str2)); // false

console.info(reg.test(str3)); // true
[/code]

看了你的评论,知道你想取出“zhu”这个值:
以下是javascript代码:
[code=\\\"javascript\\\"]
var str1 = \'aaxxzaddzhu\';
var str2 = \'aaxxzddzhu\';
var str3 = \'azhu\';
var reg = /^([^a]*a[^a]*)([^a]*a[^a]*a[^a]*)*(zhu)/;
var r = reg.exec(str1);
if(r != null)
{
console.info(r[3]); // r[3] = \'zhu\'
}
[/code]
以下是PHP代码:
[code=\\\"PHP\\\"]
$str1 = \'aaxxzaddzhu\';
$str2 = \'aaxxzddzhu\';
$str3 = \'azhu\';
$reg = \\\"/^([^a]*a[^a]*)([^a]*a[^a]*a[^a]*)*(zhu)/\\\";
preg_match($reg, $str3, $matches);
if(!empty($matches))
{
echo $matches[3]; // $matches[3] = \'zhu\'
}
[/code]

应该怎么练习使用正则表达式?

想掌握正则表达式必须通过大量的练习,各位是如何锻炼使用正则的,比如练习例子之类的?

标签:

提交需求或反馈

Demand feedback