踩坑正则表达式-匹配字符串中的整数和小数

首先,明白几个边界匹配器字符的含义。

^:整行字符串的开头位置

\A:整段字符串的开头位置

$:整行字符串的结尾位置

\z:整段字符串的结尾位置

关于\b\B,官方原版的解释中是A word boundary和A non-word boundary,没有详细的解释,反正我是没看明白,自己测试一下,匹配字符串:6lo.ve,正则表达式:\B\D。结果共三处,包括lov 三个字母。

那么我们是不是可以认为\B\D表示:匹配一个任意非数字的字符,并且字符的前一位是字母或者数字,此时这个单词不是边界单词;\b\D表示:匹配一个任意非数字的字符,并且字符的前一位不是字母或者数字,此时是一个边界单词。



再来说说数字的匹配,先来一个示例字符串:"78.64java23.678love98py3.4.5c78c++144vv7vv12..12r45v.56v56."

最简单的正则表达式为:[0-9]+(\.[0-9]+)?,可以匹配绝大多数的结果,但是如果字符串中包括3.4.512..12.5678.这种数字的,会被匹配出来3.4512125678

那我们是不是能把这几个特殊的去除掉呢?后来又想到一种匹配规则:[0-9]+\.{0,1}[0-9]+\.{0}[0-9],你有没有发现这个匹配是有点问题的,你来看啊:

  • 第一个.前面的数字是一个或者多个,后面的数字也是一个或者多个;
  • 第二个.后面的数字是一位,也就是说。

也就是说,这个规则匹配到的数字至少是三位整数,如果带有小数的话,至少要带有两位小数(整数位至少也要保证一个位数)



假设字符串里面除了字母、数字和小数点不再包含别的东西,那么我们是不是可以试试另外一种匹配模式:\B[0-9]+\.{0,1}[0-9]+\B,这个匹配中\B表示数字旁边的必定是一个单词(即数字或者字母),这样就可以排除掉3.4.512..12.5656.这种类型的数字,但是这个也有一些缺点:

  • 字符串只包含字母、数字和小数点;
  • 匹配的数字是从两位起步的;
  • 字符串的开头和结尾不能为数字,不然会被舍弃掉,例如上述字符串中78.64会变成8.64,这个问题可以通过在字符串两边各加一个字母解决掉。


暂时爬坑到这里,后续有进展接着更新...

原文地址:https://www.cnblogs.com/tudou1179006580/p/11100155.html

时间: 2024-08-25 12:29:31

踩坑正则表达式-匹配字符串中的整数和小数的相关文章

正则表达式匹配字符串中是否的整数价格和小数价格

/**     * 匹配字符串中是否的整数价格和小数价格     * @param str     * @return     */    public static String Match_the_amount(String str) {        String pattern[] = {"[1-9]\\d*\\u5143|[1-9]\\d*.\\d*\\u5143|0.\\d*[1-9]\\d*\\u5143|"                + "[1-9]\\d

C#正则表达式匹配字符串中的数字

今天遇到了类似的开发,记录一下(直接贴代码了): private void button1_Click(object sender, EventArgs e) { string str = "m=\"1\"+\"2\"+\"3\"+\"4\"+\"5\"+\"6\"+\"7\"";//字符串 Regex r = new Regex(@"(

使用正则表达式寻找字符串中出现了几个[***]样式的字符串

使用正则表达式寻找字符串中出现了几个[***]样式的字符串 源码如下: - (NSUInteger)analyseRX:(NSString *)string withPatternString:(NSString *)patternString { // \\[[^\\]]+\\] 用以匹配字符串中所出现的 [*] 的个数 // <[^>]+> 用以匹配字符串中所出现的 <*> 的个数 if (string == nil) { return 0; } // 正则表达式 NSR

识别字符串中的整数并转换为数字形式

识别字符串中的整数并转换为数字形式(40分) 问题描述: 识别输入字符串中所有的整数,统计整数个数并将这些字符串形式的整数转换为数字形式整数. 要求实现函数: void take_num(const char *strIn, int *n, unsigned int *outArray) [输入] strIn:   输入的字符串 [输出] n:       统计识别出来的整数个数 outArray:识别出来的整数值,其中outArray[0]是输入字符串中从左到右第一个整数, outArray[

用C#通过正则表达式截取字符串中符合条件的子字符串

仅仅作为简单的记录,不多说直接上代码(仅测试使用): private void Test() { Regex ConnoteA = new Regex("^[a-zA-Z]\\d{8}$"); Regex ConnoteAA = new Regex("^[a-zA-Z]{2}\\d{7,10}$"); Regex ConnoteAAA = new Regex("^[a-zA-Z]{3}\\d{5,9}$"); Regex ConnoteAAAA

C# 使用正则表达式去掉字符串中的数字

C# 使用正则表达式去掉字符串中的数字 // 去掉字符串中的数字public static string RemoveNumber(string key){    return System.Text.RegularExpressions.Regex.Replace(key, @"\d", "");} // 去掉字符串中的非数字public static string RemoveNotNumber(string key){    return System.Tex

java正则表达式匹配文本中想要的字符串

需求:获取一个本地文件中所有符合 $[MAKE_PACKAGE] 格式的字符串,并输出到另一个文件中. public static void main(String[] args) throws Exception { loadVar("src/cn/don9/templates/Action.txt","src/cn/don9/templateVar/SysActionVar.txt"); } public static void loadVar(String i

正则表达式,字符串中需要两个反斜杠“\\d”

这个正则表达式为什么会有两个反斜杠? "^.*?\\.(jpg|png|bmp|gif)$"上面这个正则表达式为什么有两个反斜杠呢?反斜杠点\.就能表示点.了,为什么还要在\.前面多加一个\? ----------------- 这要分两步看首先字符串中的\\被编译器解释为\         ------->  第一步,编译器将字符串转变为"正则表达式"然后作为正则表达式,\.又被正则表达式引擎解释为.   ----------------> 第二步,才

JavaScript 正则表达式:字符串中查找数字

上午师傅给我留了任务,让想想怎样用正则表达式,在字符串中找到数字,并替换数字.以下代码是在一段字符串中,用正则表达式找到数字,使用 replace() 方法,用找到的数字的两倍值替换原数字.replace() 方法的第二个参数为一个函数,返回找到数字的两倍值. <script> var str="去年是2014年,今年是2015年"; var newStr=str.replace(/\d+/g, function () { //调用方法时内部会产生 this 和 argum