正则表达式的边界表示

接下来学习正则表达式的边界表示,边界表示就是在写正则表达式的时候,限制匹配的字符串的开始和结束边界。

字符 描述
^ 匹配字符串开头
$ 匹配字符串结尾
\b 匹配一个单词的边界
\B 匹配非单词边界
注意:边界字符只用于描述边界信息,不能用于字符的匹配。

示例:完善之前课时中关于手机号码匹配的示例,在匹配超过11位的手机号,或者11位的手机号后边还有其他字符的情况,正则表达式也能够匹配成功,这种情况是不允许的。这种情况就需要限制手机号的结尾。

#使用$限制匹配的字符串以11位数字组成,结尾不能添加其他字符
rs = re.match("1[3578]\d{9}$","13612345678") 
print(rs.group()) #匹配正确的手机号
#手机号末尾添加字符串将匹配失败
rs = re.match("1[3578]\d{9}$","13612345678abc")#匹配失败
print(type(rs)) #空类型

运行结果:

13612345678
<class ‘NoneType’>
(使用match方法进行正则匹配“^”匹配开头不是很明显,因为match本身就是从左向右顺序匹配的)

示例:邮箱匹配

#邮箱地址以3到10个单词字符开始,以@163.com结束
rs = re.match("\w{3,10}@163.com$","hello_123@163.com")
print(rs)
rs = re.match("\w{3,10}@163.com$","he@163.com")
print(rs)
rs = re.match("\w{3,10}@163.com$","hello_12345645@163.com")
print(rs)
rs = re.match("\w{3,10}@163.com$","hello_123@163.comhaha")
print(rs)

运行结果:

<_sre.SRE_Match object; span=(0, 17), match=‘hello_123@163.com’>
None
None
None
问题1:随意用一个字母代替邮箱中的“.”也会匹配成功

rs = re.match("\w{3,10}@163.com$","hello_123@163hcom")
print("匹配结果:%s"%rs)

运行结果:

匹配结果:<_sre.SRE_Match object; span=(0, 17), match=‘hello_123@163hcom’>
原因是:在正则表达式中“.”有特殊的含义,表示除\n之外的任意字符

解决办法:使用转义字符\ 标识“.”是普通字符“.”

rs = re.match("\w{3,10}@163\.com$","hello_123@163.com")
print("匹配结果1:%s"%rs)
rs = re.match("\w{3,10}@163\.com$","hello_123@163hcom")
print("匹配结果2:%s"%rs)

运行结果:

匹配结果1:<_sre.SRE_Match object; span=(0, 17), match=‘hello_123@163.com’>
匹配结果2:None

### 如何使用正则表达式匹配和提取字符串边界 #### 边界定义 在正则表达式中,边界通常指的是特定的位置或分隔符。例如,在某些编程语言中,可以利用锚点 `^` 表示行首,`$` 表示行尾;`\b` 表示单词边界,而 `\B` 则表示非单词边界。 对于更复杂的边界情况,比如自定义的起始标记和结束标记之间的内容提取,则可以通过捕获组实现[^1]。 --- #### JavaScript 中的边界提取方法 JavaScript 提供了多种方式通过正则表达式操作字符串。如果目标是从一段文本中提取由特定边界定界的子串,可以采用以下形式: ```javascript var regex = /(?<=beginPattern).*?(?=endPattern)/g; ``` 其中: - `(?<=...)` 是 **肯定前瞻断言**,用于匹配前面的内容而不将其纳入最终结果。 - `(?=...)` 是 **肯定后瞻断言**,用于匹配后面的内容而不将其纳入最终结果。 例如,假设我们希望从字符串 `"abcXYZdef"` 中提取位于 `"XYZ"` 左右的部分: ```javascript var str = "abcXYZdef"; var result = str.match(/(?<=abc).*(?=def)/); console.log(result); // ["XYZ"] ``` 上述代码片段展示了如何基于前后固定边界提取中间部分[^1]。 --- #### C# 中的边界提取方法 C# 支持更为灵活的方式来进行复杂模式下的边界提取。借助命名捕获组功能,能够清晰地标记所需数据区域并轻松访问它们[^2]。 下面是一个例子,展示如何从 HTML 片段 `<div class="title">Hello</div>` 抽取出标签内的文字内容: ```csharp using System.Text.RegularExpressions; string input = "<div class=\"title\">Hello</div>"; Regex rg = new Regex(@"<div\sclass=""title"">(.*?)</div>", RegexOptions.Singleline); Match m = rg.Match(input); if (m.Success) { Console.WriteLine(m.Groups[1].Value); // 输出 Hello } ``` 这里的关键在于 `(.*?)` 部分——它代表尽可能少地匹配任意数量字符直到遇到下一个指定条件为止[^2]。 --- #### Python 中的边界提取方法 Python 的 `re` 模块同样提供了强大的工具集来完成此类任务。当面对多行输入时,记得设置合适的标志位以确保行为符合预期[^3]。 考虑这样一个场景:给定一个多行字符串 `str = "startA\nmiddleContent\nendB"` ,我们的目的是找到处于关键字 `'start'` 和 `'end'` 之间的一切内容: ```python import re text = """startA some random text here. another line of information. endB""" pattern = r'start(.*?)end' matches = re.findall(pattern, text, re.DOTALL) print(matches) # ['\nA\nsome random text here.\nanother line of information.\n'] ``` 此例中运用到了 `re.DOTALL` 参数让句号 `.` 能够跨越换行符工作[^3]。 --- ### 总结 不同语言虽然语法有所差异,但在处理涉及边界正则表达式问题上遵循相似逻辑:明确定义界限并通过适当技术手段加以捕捉即可达成目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值