过客大侠,问个正则式的问题

silentwins 2010-12-01 10:12:41
背景:今有字符串
***
1
***

***
a
***


目的:我要获取字符串"1"和"a"(下面暂用这组结果)或 "***\r\n1\r\n***"和"***\r\na\r\n***",

行为:于是我写正则式
/\*{3}.*?\*{3}/g


结果:当然是不对的

疑问:究竟我哪里理解错误了?
...全文
138 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
silentwins 2010-12-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 cj205 的回复:]
.元字符在很多的实现环境中是不匹配换行符的
[/Quote]

Thanks, you made the right answer.
silentwins 2010-12-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 subxli 的回复:]
C# code

string val="***\r\n1\r\n***"和"***\r\na\r\n***";
string[] strData = val.Split(new string[] { "\r\n" }, StringSplitOptions.None);
//然后你需要的值就在这个字符串数组里
[/Quote]

Sorry, I've no idea what you are talking about, and what I need is RegExp but string.Split, thanks.
q107770540 2010-12-01
  • 打赏
  • 举报
回复
/\*{3}\s*\w+\s*\*{3}/gm

sorry 更正

再试试 ?
q107770540 2010-12-01
  • 打赏
  • 举报
回复
(?m)\*{3}\s*\w+\s*\*{3}
Mr-Jee 2010-12-01
  • 打赏
  • 举报
回复
.元字符在很多的实现环境中是不匹配换行符的
Mr-Jee 2010-12-01
  • 打赏
  • 举报
回复
var str = "***\r\n1\r\n*** ***\r\na\r\n***"
var reg = /\*{3}[\d\D]*?\*{3}/g;
silentwins 2010-12-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 q107770540 的回复:]
try

/\*{3}.*?\*{3}/gm

多行匹配
[/Quote]

谢谢回复,个人觉得跟行没有关系,刚试了一下也是不对的。
假若用/\*{3}.*?/g这样一个正则式,结果能正常出现4组匹配,但后面再加上\*{3}之后,貌似一个匹配都不能成功,感觉是配对导致正则式的编译器产生混乱了,不明原因中……
huangwenquan123 2010-12-01
  • 打赏
  • 举报
回复

<script type="text/javascript">
var str="***\r\n1\r\n*** ***\r\na\r\n***";
var reg = /.*?(\s*)\S+\1.*?/g;
alert(str.match(reg)[1]+"--"+str.match(reg)[4]);
</script>
不懂装懂 2010-12-01
  • 打赏
  • 举报
回复
(?is)(?<=\*{3}).*?(?=\*{3})
subxli 2010-12-01
  • 打赏
  • 举报
回复
 
string val="***\r\n1\r\n***"和"***\r\na\r\n***";
string[] strData = val.Split(new string[] { "\r\n" }, StringSplitOptions.None);
//然后你需要的值就在这个字符串数组里
q107770540 2010-12-01
  • 打赏
  • 举报
回复
/\*{3}\s*\d+\s*\*{3}/gm
silentwins 2010-12-01
  • 打赏
  • 举报
回复
"***\r\n1\r\n***"和"***\r\na\r\n***"

为简化正则式,暂用的是这组结果,上面写错组别了,不好意思。
q107770540 2010-12-01
  • 打赏
  • 举报
回复
try

/\*{3}.*?\*{3}/gm

多行匹配
ycproc 2010-12-01
  • 打赏
  • 举报
回复

帮顶
-过客- 2010-12-01
  • 打赏
  • 举报
回复
楼主写的正则主要问题是因为小数点是不能匹配换行符的,在我所知的任何语言中,在不改变匹配模式的情况下,都是不能匹配换行符的

JavaScript中小数点的匹配行为有些特殊,由于各浏览器的解析引擎不同,“.”的匹配范围也有所不同,对于Trident内核的浏览器,如IE来说,“.”同样是匹配除了换行符“\n”以外的任意一个字符,但是对于其它内核的浏览器,如Firefox、Opera、Chrome来说,“.”是匹配除了回车符“\r”和换行符“\n”以外的任意一个字符。

在C#等一些语言中提供了匹配模式,可以改变部分元字符的匹配行为。Singleline可以使小数点匹配任意字符
关于小数点的总结,参考
正则基础之——小数点

改进方法就是采用 cj205 的[\d\D],或[\w\S]、[\s\S]等等
值得注意的是,JavaScript中的m或C#中的Multiline模式,叫做多行模式,但并不与单行模式对应,纯粹是历史原因造成的,它改变的是“^”和“$”的匹配行为,而不是小数点的

其实楼主的需求,可以使用更小范围的元字符,采用贪婪模式,效率更高
<script type="text/javascript"> 
var str = "***\r\n1\r\n*** ***\r\na\r\n***"
var reg = /\*{3}\s*(\S+)\s*\*{3}/g;
var result;
while((result = reg.exec(str)) != null)
{
document.write(result[1] + "<br />");
}
</script>

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧