0 0

彩票中奖号码的正则表达式写法45

七星彩玩法介绍http://result.lottery.gov.cn/wanfa/qxc.html
引用
特等奖:单注彩票的7位数号码与中奖号码相同且排列一致,如中奖号码为1234567,所选单注彩票的号码也为1234567,即中特等奖。

  一等奖:单注彩票号码中连续6位数号码与中奖号码相同位置的连续6位数相同,如中奖号码为1234567,所选单注彩票的号码为123456X或X234567,即中一等奖。

  二等奖:单注彩票号码中连续5位数号码与中奖号码相同位置的连续5位数相同,如中奖号码为1234567,所选单注彩票的号码为12345XX、X23456X或XX34567,即中二等奖。

  三等奖:单注彩票号码中连续4位数号码与中奖号码相同位置的连续4位数相同,如中奖号码为1234567,所选单注彩票的号码为1234XXX、X2345XX、XX3456X或XXX4567,即中三等奖。

  四等奖:单注彩票号码中连续3位数号码与中奖号码相同位置的连续3位数相同,如中奖号码为1234567,所选单注彩票的号码为123XXXX、X234XXX、XX345XX、XXX456X或XXXX567,即中四等奖。

  五等奖:单注彩票号码中连续2位数号码与中奖号码相同位置的连续2位数相同,如中奖号码为1234567,所选单注彩票的号码为12XXXXX、X23XXXX、XX34XXX、XXX45XX、XXXX56X或XXXXX67,即中五等奖。

如上面的奖项列表 加入中奖号码是1234567
一等奖正则表达式:(^123456[0-9]$)|(^[0-9]123456$)
二等奖正则表达式:跟一等奖类似,也要枚举出所有情况
等到了五等奖这个正则就会很长了
有没有更简单的办法捏???
问题补充:
补充一下:用户购买的彩票号码保存在一个表中,无论多少注都存在一个字段中 如下
id   buyNumbers
1    1234567|2345676|3454658
2    1234567|2345676|3464658|9867565
....
如果采用传统的方式要扫描全表,这样当数据量极大时,效率是极差的
并且七星彩只是一种玩法,还有排列3、 排列5等 想寻求一种高效的方法快速找出中奖号码
2008年6月17日 17:51

22个答案 按时间排序 按投票排序

0 0

楼主,正则表达式找到你所需要的号,并不会象你想的那样越写越长的,我给你一个参考思路。

思路重点:所有的奖级的正则表达式都是:[0-9]*中奖字串[0-9]*

这个星号是通配有或者没有的。用你的例子说明:1234567是特等奖,那么中奖字串是1234567,如果是特等奖就会被这个正则表达式找到。抽三等奖说,如果中奖号是XXX1234等情况,那么中奖字串是1234,同样所有组合会被这个正则表达式找到。

我写一个示例,大致的函数如下吧:

public static boolean isWin(String right, String custom){
    return custom.matches("[0-9]*"+right+"[0-9]*");
}

其中right是中奖级的号码,custom是客户买的个性号,因此很容易知道是几等奖。
public static void main(String[] args) {
    if ( isWin("1234567","1234567"))
        System.out.println("匹配");
    if (isWin("12345","1234560"))
        System.out.println("匹配");
    if ( isWin("124","1234560") )
        System.out.println("匹配");
    if ( isWin("34","1234560"))
        System.out.println("匹配");
}

以上示例没有做严谨的运行测试,主要阐述这个思路,应该是可行的。

2008年6月24日 14:42
0 0

购买的彩票号与开奖号对应关系应有这么几种情况:
1.全中,或全不中
2.只出现一次连续号码
3.出现两次连续号码
分析出来就好办了

public int getLevel(String right, String buy) {
		char[] rightNumber = right.toCharArray();
		char[] bugNumber = buy.toCharArray();
		// 标识数
		int flag = 0;
		// 结果
		int result = 0;
		for (int i = 0; i < rightNumber.length; i++) {
			if (rightNumber[i] == bugNumber[i]) {
				flag++;
			}
			// 当标识数大于1时,表示已经获奖,将标识数赋给结果
			// 当再次出现标识数大于1,且大于上次的结果时,重新赋给结果
			//例如 right="1234567"
			//    bug="12x4567"
			if (flag > 1 && flag > result) {
				result = flag;
			}
			// 一旦出现连续相等的情况中断,标识数置0
			if (rightNumber[i] != bugNumber[i]) {
				flag = 0;
			}
			if (flag == 7) {
				result = flag;
			}
		}
		return result;
	}

result返回的是连续相等的个数,可以根据实际情况写出对应的中奖级别

2008年6月24日 11:11
0 0

我没有用正则表达式,

如七星彩的中将计算:

int Star7BonusChecker::bonus(const Ticket& ticket)
{
    int redIndCount=(ticket.getSector(0)).continuousMatch(openResult.getSector(0));


    if(redIndCount==7)
        return 1;
    if(redIndCount==6)
        return 2;
    if(redIndCount==5)
        return 3;
    if(redIndCount==4)
        return 4;
    if(redIndCount==3)
        return 5;
    if(redIndCount==2)
        return 6;


    return 0;
}

2008年6月23日 14:14
0 0

本人的类层次设计,前不久做的


//彩票获奖检测类的父类
class BonusChecker
{

protected:
    OpenResult  openResult;
public:
    BonusChecker(const OpenResult & Or);
    virtual int bonus(const Ticket& ticket)=0;
    virtual int money(const Ticket& ticket)=0;
};

//双色球
class Color2BonusChecker: public  BonusChecker
{
public:
Color2BonusChecker(const OpenResult & Or):BonusChecker(Or){}
virtual int bonus(const Ticket& ticket);
virtual int money(const Ticket& ticket);

};


class Star7BonusChecker: public  BonusChecker
{
public:
Star7BonusChecker(const OpenResult & Or):BonusChecker(Or){}
virtual int bonus(const Ticket& ticket);
virtual int money(const Ticket& ticket);

};

等等

2008年6月23日 14:13
0 0

为了配合大赛,我再发一遍我的答案:(不算作弊吧)
按楼主的说法七星彩只要有两个连续的就成立,只要完成这个目标就可以了,至于是几等奖先不考虑,我用javascript的正则语法来写,其他的语言类似
举例:中奖号是1234567,待检测的号是1030567

'1030567'.replace(/(?:(1)|(?:.))(?:(2)|(?:.))(?:(3)|(?:.))(?:(4)|(?:.))(?:(5)|(?:.))(?:(6)|(?:.))(?:(7)|(?:.))/,'$1x$2x$3x$4x$5x$6x$7x').match(/(\dx){2,7}/g)

可以看出正则的写法就是把中奖号转换成(?:(x)|(?:.))这样的结构,x是站位符.
替换字符$1x$2x$3x$4x$5x$6x$7中的x也是站位符,其他的当然也可以了.
至于是几等奖由match(/(\dx){2,7}/g)来负责,处理它的结果就可以了。
另一个例子:
'0000067'.replace(/(?:(1)|(?:.))(?:(2)|(?:.))(?:(3)|(?:.))(?:(4)|(?:.))(?:(5)|(?:.))(?:(6)|(?:.))(?:(7)|(?:.))/,'$1x$2x$3x$4x$5x$6x$7x').match(/(\dx){2,7}/g)

2008年6月22日 23:37
0 0

int[] bingo = {1,2,3,4,5,6,7};//中将号码
int[] pp = {2,2,3,6,8,0,1};//待检验的号码
int count = 0;
for(int i=0; i<bingo.length;i++){
    if(bingo[i] == pp[i]){
        count ++;
    }else{
        if(count > 1) break;//至少中了两位
        count = 0;//没有连续中两位,则清零
    }
}
if(count == bingo.length)
System.out.println("恭喜你,您中了特等奖");
if(count == 2)
System.out.println("恭喜你,您中了"+(bingo.length-count)+"等奖");


这样不是更方便吗?

2008年6月22日 12:19
0 0

少了个x

'0000067'.replace(/(?:(1)|(?:.))(?:(2)|(?:.))(?:(3)|(?:.))(?:(4)|(?:.))(?:(5)|(?:.))(?:(6)|(?:.))(?:(7)|(?:.))/,'$1x$2x$3x$4x$5x$6x$7x').match(/(\dx){2,7}/g)

2008年6月21日 18:46
0 0

这样就好了:

'1034507'.replace(/(?:(1)|(?:.))(?:(2)|(?:.))(?:(3)|(?:.))(?:(4)|(?:.))(?:(5)|(?:.))(?:(6)|(?:.))(?:(7)|(?:.))/,'$1x$2x$3x$4x$5x$6x$7').match(/(\dx){2,7}/g)

当然还要配合一下程序判断是几等奖,这个就简单了.

2008年6月21日 18:44
0 0

哈哈:
我的方法应该实现了.按楼主的说法七星彩只要有两个连续的就成立,只要完成这个目标就可以了,至于是几等奖先不考虑,我用javascript的正则语法来写,其他的语言类似
举例:中奖号是1234567,待检测的号是1030567

'1030567'.replace(/(?:(1)|(?:.))(?:(2)|(?:.))(?:(3)|(?:.))(?:(4)|(?:.))(?:(5)|(?:.))(?:(6)|(?:.))(?:(7)|(?:.))/,'$1x$2x$3x$4x$5x$6x$7').search(/\dx\d/);

可以看出正则的写法就是把中奖号转换成(?:(x)|(?:.))这样的结构,x是站位符.
替换字符$1x$2x$3x$4x$5x$6x$7中的x也是站位符,其他的当然也可以了.
同样至于是几等奖由search(/\dx\d/)来负责,
我感觉直接判断出是几等奖好像也有思路,不过应该有点困难.

2008年6月21日 18:31
0 0

不好意思上面少了一个"\"
123456X 正则表达式^123456[\d]$ 比 ^123456[0-9]$少写两个数字

2008年6月21日 15:12
0 0

123456X 正则表达式^123456[d]$ 比 ^123456[0-9]$少写两个数字

2008年6月21日 15:06
0 0

从性能来考虑,必须要一位存放一个字段,加上索引,这样的性能是无与伦比的。如果整个数字放在一个字段,性能就没法说啦。呵呵。
个人认为,考虑使用正则表达式来解决这个问题的思路是错误的。

2008年6月20日 12:15
0 0

还是写程序比较方便。

xx34xxx已经是正则表达式的形式了,如果要更简单,那就变成正则表达式的正则表达式了

2008年6月18日 15:53
0 0

汗......
没看清楚题目.
刚才写的回答是牛头不对马嘴...见笑了.
回去研究一下,明天继续回答,还不信抢不到了.

2008年6月17日 22:34
0 0

ham 说的对阿,呵呵,各位不厚道了。正则表达式,是可以的,咋能说不行呢,而且正则表达式的效率也是挺高的。

2008年6月17日 22:14
0 0

光靠正则表达式解决不了,还需要判断同位的最大值是多少。
我来个Ruby的解法,思路是将字符串转成char array,然后进行相减取绝对值,对重新拼成的字符串获取连续0最长的子串:

def lottery_match(lottery_number, guess_number)
  match = ""
  Array.new(7){|index| guess_number[index]}.each_with_index{|s, i| match << (s - lottery_number[i]).abs.to_s}
  7 - match.scan(/0+/).max.size
end


运行
lottery_match("1234567", "1243867")
# => 5

lottery_match("1234567", "1243567")
# => 4

2008年6月17日 21:30
0 0

各位不厚道啊..一看分多来得比谁都快,把我给挤得坐板凳...

如果要说最简单,还是要用编程的方式来实现,用正则表达式,觉得有点太大材小用了.但如果楼主硬是要钻牛角尖,那我也没办法了...

一看楼上都已经发了这么多代码了,搞得我都不敢再发了.不过为了让楼主得到更好的解答方法,本人还是弱弱的奉上代码:

public int getLevel(int rightNumber,int buyNumber){
    //将号码转换为数组
    var right=rightNumber.toCharArray();
    var buy=buyNumber.toCharArray();
    //将两个号码逐位进行比较,如果找到不同的,就跳出.
    for(int i=0;i<right.length;i++){
        if(right[i]!=buy[i]) break;
    }
    //用正确的号码的长度减去首先开始不同的数位的下标+1,得到的就是中奖等级了.
    return rightNumber.length-(i+1);
}


还未测试,不知道可不可以正常运行..

2008年6月17日 20:36
0 0

ls,要连续2个位置相等

2008年6月17日 19:30
0 0

数据库
一个字段放一个数字
直接写 select * from row1 = 1 and row2 = 2

不就完事了么

2008年6月17日 18:57
0 0

理解错了,上面的代码返回类型不应该是数组型,又改了一下,程序输出
(^1234\d{3}$)|(^\d{1}2345\d{2}$)|(^\d{2}3456\d{1}$)|(^\d{3}4567$)


/**
 * Light-commons Project
 * http://light-commons.googlecode.com
 * Copyright (C) 2008 Jason Green
 * email: guileen@gmail.com
 *
 * License: Apache License 2.0 
 * (http://www.apache.org/licenses/LICENSE-2.0)
 *
 */
package org.lightcommons;

import org.lightcommons.logger.Log;
import org.lightcommons.logger.LogFactory;

/**
 * @author gl
 * @since Jun 17, 2008
 */
public class TestXX {
	private static final Log log = LogFactory.getLog(TestXX.class);

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println(getPatterns("1234567", 3));
	}

	public static String getPatterns(String rightNumber, int maxWrong) {
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i <= maxWrong; i++) {
			if(i>0)
				sb.append("|");
			sb.append("(^");
			if (i > 0) {
				sb.append("\\d{" + i + "}");
			}
			sb.append(rightNumber.substring(i, rightNumber.length()
							- maxWrong+i));
			if (maxWrong > i) {
				sb.append("\\d{" + (maxWrong - i) + "}");
			}
			sb.append("$)");
		}
		return sb.toString();
	}

}

2008年6月17日 18:49
0 0

刚才的代码在线写的,有错,在eclipse里面运行了一下,OK了

/**
 * Light-commons Project
 * http://light-commons.googlecode.com
 * Copyright (C) 2008 Jason Green
 * email: guileen@gmail.com
 *
 * License: Apache License 2.0 
 * (http://www.apache.org/licenses/LICENSE-2.0)
 *
 */
package org.lightcommons;

import org.lightcommons.logger.Log;
import org.lightcommons.logger.LogFactory;

/**
 * @author Jason Green
 * @since Jun 17, 2008
 */
public class TestXX {
	private static final Log log = LogFactory.getLog(TestXX.class);

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		for(String s:getPatterns("1234567", 3))
			System.out.println(s);
	}

	public static String[] getPatterns(String rightNumber, int maxWrong) {

		final String[] result = new String[maxWrong + 1];
		for (int i = 0; i <= maxWrong; i++) {
			final StringBuffer sb = new StringBuffer();
			sb.append("^");
			if (i > 0) {
				sb.append("\\d{" + i + "}");
			}
			sb.append(rightNumber.substring(i, rightNumber.length()
							- maxWrong+i));
			if (maxWrong > i) {
				sb.append("\\d{" + (maxWrong - i) + "}");
			}
			sb.append("$");
			result[i] = sb.toString();
		}
		return result;
	}

}

2008年6月17日 18:42
0 0

个人认为只能编程实现

String[] getPatterns(String rightNumber,int maxWrong){

  String[] result = new String[maxWrong+1];
  for(int i=0;i<=maxWrong;i++){
    StringBuffer sb = new StringBuffer();
    if(i>0)
      sb.append("\\d{"+i+"}");
    sb.append(rightNuber.substring(i,rightNumber.length()-maxWrong));
    if(maxWrong>i)
      sb.append("\\d{"+(maxWrong-i)+"}");
    result[i]=sb.toString();
  }

}

2008年6月17日 18:28

相关推荐

    java 最新手机号码、电话号码正则表达式

    最新手机号码、电话号码正则表达式

    pb 使用正则表达式源码pbregexp

    标题中的“pb 使用正则表达式源码pbregexp”指的是在PowerBuilder(简称pb)环境中,利用名为“pbregexp”的正则表达式组件来实现源代码级别的正则表达式操作。PowerBuilder是一款流行的可视化的、面向对象的软件...

    全球手机号码正则表达式

    【全球手机号码正则表达式】 1.格式:JSON 2.例示:{"86":{"regex":"^(86){0,1}1\d{10}$","sn":"CN"}} 3.通过短号例如:86,从json的key中获取正则表达式(regex),国家代码(sn)

    Lucene 使用正则表达式

    ### Lucene 使用正则表达式 #### 知识点概览 1. **Lucene简介** 2. **正则表达式(regex)在Lucene中的应用** 3. **regexQuery详解** 4. **示例代码解析** 5. **索引创建与查询流程** 6. **正则表达式的语法** #### ...

    PB实现的正则表达式

    1. 创建正则表达式:定义你要匹配的模式,例如`^[\d]{3}-[\d]{4}$`用于匹配美国电话号码格式。 2. 编译模式:将正则表达式编译成一个可以执行的对象,以提高后续匹配的速度。 3. 执行匹配:使用编译后的对象在目标...

    正则表达式转换工具

    - 数据验证:在表单提交时,可以使用正则表达式验证输入格式,如邮箱、电话号码等。 - 文件搜索:在代码编辑器中,使用正则表达式快速查找和替换特定模式的文本。 - 数据清洗:在数据预处理阶段,正则表达式可以...

    正则表达式测试工具C#版(src)

    正则表达式是一种强大的文本处理工具,用于在字符串中进行模式匹配和搜索。在C#编程语言中,正则表达式被广泛应用于数据验证、文本提取、格式转换等多个场景。本项目提供了一个C#编写的正则表达式测试工具,包含完整...

    VC、VC++,MFC 正则表达式类库

    正则表达式类库则为VC++和MFC的开发者提供了对正则表达式功能的支持。 "VC、VC++,MFC 正则表达式类库"指的是在MFC中实现或集成的正则表达式处理模块。这个库通常包含一系列的类和函数,允许程序员编写符合特定模式...

    IP手机号码正则表达式

    本文将深入探讨“IP手机号码正则表达式”这一主题,结合提供的资源,我们主要关注如何使用正则表达式来验证和处理IP地址与手机号码。 首先,IP地址通常是指互联网协议地址,它是一个32位的二进制数,用于标识网络上...

    正则表达式必知必会v_1.0.pdf

    "正则表达式必知必会" 正则表达式是一种强大的文本处理工具,广泛应用于各个领域。下面是对正则表达式的详细解释: 正则表达式的用途 正则表达式主要用于处理文本,提供了两大主要功能:查找和替换。查找功能允许...

    C语言正则表达式库

    C语言正则表达式库是用于在C编程环境中处理和匹配正则表达式的软件库。这个库名为PCRE(Perl Compatible Regular Expressions),正如其名,它与Perl语言中的正则表达式语法高度兼容,提供了丰富的功能和强大的匹配...

    qt使用正则表达式限制lineEdit的输入,对正则表达式进行了封装,可以直接引入,工程编译正常

    在Qt框架中,正则表达式(Regular Expression)是一种强大的文本处理工具,它允许程序员以结构化的方式匹配、查找、替换或验证字符串。本项目针对Qt的lineEdit组件,通过正则表达式实现了输入限制功能,使得lineEdit...

    Java使用正则表达式提取XML节点内容的方法示例

    Java使用正则表达式提取XML节点内容的方法示例 Java使用正则表达式提取XML节点内容的方法示例主要介绍了Java使用正则表达式提取XML节点内容的方法,结合具体实例形式分析了java针对xml格式字符串的正则匹配相关操作...

    正则表达式大全 - 收集的最常用正则表达式

    9. 匹配QQ号码:`[1-9][0-9]{4,}` - 这个正则表达式用于验证腾讯QQ号码,QQ号码从10000开始,且至少有5位数字。 10. 匹配中国邮政编码:`[1-9]d{5}(?!d)` - 邮政编码通常为6位数字,这个正则表达式确保了这一点。 ...

    正则表达式在数据库查询中的应用

    - **兼容性问题**:不同的数据库系统支持的正则表达式语法可能存在差异,需要根据所使用的数据库类型调整正则表达式的写法。 - **安全性问题**:在用户输入的数据中使用正则表达式时,应注意防止SQL注入攻击,确保...

    wps正则表达式 以及 wps通过正则表达式验证手机号码

    在WPS 2020及后续版本中,这一特性使得用户能够利用正则表达式处理数据,比如验证手机号码的合法性。 首先,让我们了解什么是正则表达式。正则表达式(Regular Expression)是一种模式匹配语言,它由一系列字符和...

    精通正则表达式(第3版)(含awz3 mobi epub)

    随着互联网的迅速发展,几乎所有工具软件和程序语言都支持的正则表达式也变得越来越强大和易于使用。本书是讲解正则表达式的经典之作。本书主要讲解了正则表达式的特性和流派、匹配原理、优化原则、实用诀窍以及调校...

    正则表达式验证工具,正则表达式校验工具

    正则表达式验证工具 V1.0 本软件主要用于检测正则表达式是否正确。 运行环境:本软件为绿色软件,无需安装,但需要Microsoft .NET Framework 4 支持,如果没有请前去下载(下载路径:...

    易语言正则表达式文本替换

    例如,"子程序_正则文本替换"可能就是一个易语言中用于执行正则表达式替换的子程序,它接收输入的文本、正则表达式模式和替换字符串,然后返回经过替换操作的新文本。 1. **正则表达式基础** - **元字符**:如`.`...

Global site tag (gtag.js) - Google Analytics