任何人都可以让我知道正则表达式用于查找给定字符串中4的倍数的正则数。该字符串将包含文本和数字。
提前致谢
答案 0 :(得分:3)
抱怨正则表达式不是正确的工具,并没有真正回答这个问题,我认为这是一个适得其反的问题。尽管提问者可能没有意识到有更好的方法。但是,也许他正在构建一个全新的语言编译器的词法分析器,它只需要某些除数作为标记?
这可能不太可能也不切实际,但我的观点是,对推断出的动机做出判断并没有任何好处......无论如何......
我认为这是一个有趣的问题,如果没有其他原因,它在学术上提出了一个有趣的挑战,并回答你的问题有一种方法来使用正则表达式来确定倍数。
最终正则表达式只是一个模式匹配器吗?那么什么类型的模式可能由四位数的数字创建?为了回答这个问题,我写了一个快速程序,打印出1到500的所有四个倍数(试一试)。
import java.io.FileWriter;
public class Four {
public static void main(String args[]){
StringBuilder myFour = new StringBuilder();
int i = 1;
int mult = 0;
while(mult < 500){
mult = i*4;
myFour.append(mult + "|");
i++;
}
try{
FileWriter writer = new FileWriter("out.txt");
writer.write(myFour.toString());
writer.close();
} catch(Exception e){e.printStackTrace();}
}
}
我注意到每个数字的最后一位数字在0 4 8 2 6之间交替。现在你可能想立即使用它,只需检查所有数字字符串,看看它们是否以这些数字之一结束,但这不起作用,因为其他整数也以那些本身不能被4整除的数字结束,例如10,14,18,22,26等......所以继续搜索。接下来,我查看了最后两位数字,发现0到100之间的重复模式
4 | 8 | 12 | 16 | 20 | 24 | 28 | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | 96 | 100 | ... | 204 | 208 | 212 | ...
如果你用零填充单个数字前缀,你会注意到这个模式会重复每增加100个。所以现在我对自己的某些东西感到非常自信。为了进一步测试我的理论,我提取谷歌并输入2147483648%4(这是超过最大32位有符号int值的下一个最高数字,可以被4整除)这只是第一个任意值,我想到并且没有其他意思我知道,因为它结果是2147483648%4 = 0所以我现在感觉非常好。我想你实际上可以写出一个数学证明并证明这个理论是有效的,但我更倾向于应用。所以我想在这一点上我所要做的就是编写这个正则表达式然后我可以根据上面编写的程序的输出来测试它。所以我的下一个目标是编写实际的正则表达式。
如果您注意到我方便地将程序打印出OR正则表达式操作符,那么我可以剪切并粘贴大部分正则表达式,我就在家中。我想要的只是最后两位数,所以我的正则表达式的第一部分看起来像这样:
(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)
你会注意到我将零加上单个数字并在前面加了00。再次这是因为我想匹配最后的两个字符,包括100中的00(这也将返回0的字符串作为它应该的四个有效倍数)。所以现在我有我的正则表达式后缀wrtten。根据我的理论,前面两位数字后缀的任何数字串都是四的倍数所以我只需要为前缀(任何数字)编写规则,我就完成了。这很简单,只是[0-9] *所以现在我的正则表达式看起来像这样:
[0-9]*(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)
现在我差不多完成了。我忘记了什么?单个数字!!!上面的正则表达式将拒绝0,4和8,因为它们是单个数字,并且上述模式仅匹配前面带有0或更多个数字的两个数字。所以我必须稍微调整正则表达式,我最终得到这个:
(0|4|8)|([0-9]*(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96))
这就是它。从技术上讲,您还需要添加单词边界,因为您希望将整个数字字符串视为单词。你会添加像这样的边界标签:
\b(0|4|8)|([0-9]*(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96))\b
但是否这样做取决于您的申请。如果你打算在词法分析器中使用它,你可能正在构建jflex,例如你可能不想包含那些,因为你可能有其他类似词位的规则。
总而言之,我将如何做到这一点。这可能不是最简洁的正则表达式,我确信有更好的方法可以做到这一点,但如果你正在寻找快速和肮脏的东西我不认为它变得更快或更脏。另外,我认为如果我引导你完成思考过程可能会有所帮助。快速和肮脏的缺点是,我可能完全错了,如果是这样,现在你可以看到我出轨的确切位置,你可以把火车自己放回轨道;)希望这有帮助....
答案 1 :(得分:2)
正则表达式不适合做这项工作,但如果您真的想要,请试试:
/[[0268][048]|[13579][26])(\D|$)/
答案 2 :(得分:1)
使用正则表达式,您只能提取整数。但是,只能提取偶数:
(\d*[02468])
然后你必须检查它们是否可以使用4
进行模数测试:
if ( ( number != 0 ) && ( number % 4 == 0 ) ) {
// number is dividable with 4 and does not equal 0
}