ChatGPT解决这个技术问题 Extra ChatGPT

仅用于数字的正则表达式

我根本没有使用过正则表达式,所以我很难排除故障。我希望正则表达式仅在包含的字符串都是数字时才匹配;但是对于下面的两个示例,它匹配包含所有数字加上等号的字符串,例如“1234 = 4321”。我确信有办法改变这种行为,但正如我所说,我从来没有真正用过正则表达式。

string compare = "1234=4321";
Regex regex = new Regex(@"[\d]");

if (regex.IsMatch(compare))
{ 
    //true
}

regex = new Regex("[0-9]");

if (regex.IsMatch(compare))
{ 
    //true
}

万一这很重要,我使用的是 C# 和 .NET2.0。

您需要匹配数字或数字吗?例如:123.456 是一个数字,但不是全数字。
确切地说,OP 并不完全清楚是否使用整数
为什么不尝试解析那个简单案例的字符串呢? bool decimal.TryParse(string string, out decimal result) 或 bool int.TryParse(string string, out int result)
查看 this answer 以获得使用正则表达式解析数字的明确处理。
一般来说,在我看来,解决正则表达式问题的最简单方法是使用命令行解释器,如果你的语言允许的话(似乎大多数人都这样做)。由于此示例是在 C# 中,您可以使用 linqpad.net,或者您可以在调试器中使用断点,然后将 VS 中的即时窗口用作 CLI。

C
Community

使用开始和结束锚点。

Regex regex = new Regex(@"^\d$");

如果您需要匹配多个数字,请使用 "^\d+$"

请注意,"\d" 将匹配 [0-9] 和其他数字字符,如东方阿拉伯数字 ٠١٢٣٤٥٦٧٨٩。使用 "^[0-9]+$" 将匹配限制为仅阿拉伯数字 0 - 9。

如果您需要包含除数字以外的任何数字表示形式(例如起始值的十进制值),请参阅 @tchristcomprehensive guide to parsing numbers with regular expressions


一组数值怎么样?这通常适用于某些国家的邮政编码,例如印度。我想我们可能必须在此之后进行字符串长度检查?
@Najeeb 是的,因为印度邮政编码是 6 位数字,您可以使用 "^\d{6}$" 之类的东西。其他一些国家的邮政编码规则更复杂,因此多个国家的正则表达式解决方案也可能变得相当复杂。查看 stackoverflow.com/q/578406/1288 中的一些示例
我使用 [0-9] 而不是 \d。它使 RegEx 更易于阅读。
T
Taz

您的正则表达式将匹配任何包含数字的内容,您想使用锚点来匹配整个字符串,然后匹配一个或多个数字:

regex = new Regex("^[0-9]+$");

^ 将锚定字符串的开头,$ 将锚定字符串的结尾,而 + 将匹配其前面的一个或多个(在本例中为数字)。


C
Community

如果您需要容忍小数点和千位标记

var regex = new Regex(@"^-?[0-9][0-9,\.]+$");

如果数字可以变为负数,您将需要一个“-”。


@Florin Ghita。谢谢。 “-”必须在开头。
此正则表达式还错误地允许前导负号 (-) 和句点 (.) 出现多次。
您可以通过 ?-. 设为可选。 -?\d+(?:\.\d+)? 将匹配整数或小数。 (括号中的 ?: 只是使括号成为非捕获组,并且为了清楚起见仅用于分组。)
对于像 1,.5 这样的边缘情况,它会失败,但如果你监督的话。对于像-2这样的基本情况,它仍然失败。请将其更改为 ^-?[0-9][0-9,\.]*$ 以避免在基本情况下失败。 + 替换为 *
不匹配“0”
D
Daniele D.

这适用于整数和十进制数。如果数字有逗号千位分隔符,则不匹配,

"^-?\\d*(\\.\\d+)?$"

一些与此匹配的字符串:

894
923.21
76876876
.32
-894
-923.21
-76876876
-.32

一些没有的字符串:

hello
9bye
hello9bye
888,323
5,434.3
-8,336.09
87078.

k
kasperjj

它是匹配的,因为它正在寻找“匹配”而不是完整字符串的匹配。您可以通过更改正则表达式来专门查找字符串的开头和结尾来解决此问题。

^\d+$

R
Rezo Megrelidze

也许我的方法会对你有所帮助。

    public static bool IsNumber(string s)
    {
        return s.All(char.IsDigit);
    }

请记住,对于属于 UnicodeCategory.DecimalDigitNumber 类别的任何字符,Char.IsDigit 返回 true。这可能不是 OP 想要的。另见Why Char.IsDigit returns true for chars which can't be parsed to int?
M
Maicon Mauricio

如果您需要检查所有数字是否都是数字(0-9),

^[0-9]+$

火柴

1425
0142
0
1

并且不匹配

154a25
1234=3254

f
fnc12

抱歉,格式很丑。对于任意位数:

[0-9]*

对于一位或多位数字:

[0-9]+

M
Mark Brackett

^\d+$,英文为“字符串开头”、“1位或多位”、“字符串结尾”。


M
Marina

这是我的工作:

^(-?[1-9]+\\d*([.]\\d+)?)$|^(-?0[.]\\d*[1-9]+)$|^0$

还有一些测试

阳性测试:

string []goodNumbers={"3","-3","0","0.0","1.0","0.1","0.0001","-555","94549870965"};

阴性测试:

string []badNums={"a",""," ","-","001","-00.2","000.5",".3","3."," -1","--1","-.1","-0"};

不仅检查了 C#,还检查了 Java、Javascript 和 PHP


".3","3."实际上是很好的数字(分别表示 0.3 和 3.0)。我们一直在源系统中看到这一点,您提到的语言的大多数 to_number(xx) 函数都可以正确识别和转换它们。谢谢。
@Ruslan 在许多系统“.3”、“3”中你是对的。将解析为有效数字并按照您提到的“0.3”和“3.0”使用。但另一方面 - 那是转换值,所以原始值“.3”和“3”。不是真正存在的数字。
O
Oli Folkerd

使用开始和结束锚点。

 Regex regex = new Regex(@"^\d$");

如果您需要匹配多个数字,请使用 "^\d+$"


t
tripleee

虽然上述解决方案都不符合我的目的,但这对我有用。

var pattern = @"^(-?[1-9]+\d*([.]\d+)?)$|^(-?0[.]\d*[1-9]+)$|^0$|^0.0$";
return Regex.Match(value, pattern, RegexOptions.IgnoreCase).Success;

有效值示例:

"3",
"-3",
"0",
"0.0",
"1.0",
"0.7",
"690.7",
"0.0001",
"-555",
"945465464654"

无效值示例:

"a",
"",
" ",
".",
"-",
"001",
"00.2",
"000.5",
".3",
"3.",
" -1",
"--1",
"-.1",
"-0",
"00099",
"099"

你可以给我更多细节,因为它揭示了一个错误
我把 textbox_changed
private void textBox2_TextChanged(object sender, EventArgs e) { var pattern = @"^(-?[1-9]+\d*([.]\d+)?)$|^(-?0[.]\d *[1-9]+)$|^0$|^0.0$";返回 Regex.Match(textBox1.Text, pattern, RegexOptions.IgnoreCase).Success; }
@EduardoHerrera 有什么错误?
S
S.M.Mousavi

另一种方式:如果您喜欢匹配波斯语或阿拉伯语等国际数字,则可以使用以下表达式:

Regex = new Regex(@"^[\p{N}]+$");

要匹配文字句点字符,请使用:

Regex = new Regex(@"^[\p{N}\.]+$");

T
Tagar

整数和浮点数的正则表达式:

^[+-]?\d*\.\d+$|^[+-]?\d+(\.\d*)?$

数字可以以句点开头(不带前导数字),数字可以以句点结尾(不带尾随数字)。上面的正则表达式会将两者都识别为正确的数字。

一个 。 (句点)本身没有任何数字不是正确的数字。这就是为什么我们需要两个正则表达式部分(用“|”分隔)。

希望这可以帮助。


这是最完整的解决方案。恭喜!
A
Azur

我认为这是最简单的一种,它接受欧洲和美国的数字书写方式,例如 USA 10,555.12 欧洲 10.555,12 而且这个不允许多个逗号或点一个接一个,例如 10..22 或 10,.22除此之外,像 .55 或 ,55 这样的数字也会通过。这可能很方便。

^([,|.]?[0-9])+$

没有单一的欧洲书写数字的方式。我们(de-CH)会写 10'555.12(以及我们的“Bundeskanzlei”10 555,12)。
C
Chathuranga Kasthuriarachchi
 console.log(/^(0|[1-9][0-9]*)$/.test(3000)) // true

虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。 How to Answer
J
James Selvakumar

如果您只想从字符串中提取数字,则模式 "\d+" 应该会有所帮助。


Y
Yawar Ali

检查字符串是 uint、ulong 还是仅包含数字 one .(dot) 和 digits Sample 输入

Regex rx = new Regex(@"^([1-9]\d*(\.)\d*|0?(\.)\d*[1-9]\d*|[1-9]\d*)$");
string text = "12.0";
var result = rx.IsMatch(text);
Console.WriteLine(result);

样品

123 => True
123.1 => True
0.123 => True
.123 => True
0.2 => True
3452.434.43=> False
2342f43.34 => False
svasad.324 => False
3215.afa => False

P
Programmer

以下正则表达式仅接受英语和阿拉伯语(波斯语)语言中的数字(也是浮点数)(就像 Windows 计算器一样):

^((([0\u0660\u06F0]|([1-9\u0661-\u0669\u06F1-\u06F9][0\u0660\u06F0]*?)+)(\.)[0-9\u0660-\u0669\u06F0-\u06F9]+)|(([0\u0660\u06F0]?|([1-9\u0661-\u0669\u06F1-\u06F9][0\u0660\u06F0]*?)+))|\b)$

上面的正则表达式接受以下模式:

11
1.2
0.3
۱۲
۱.۳
۰.۲
۲.۷

上面的正则表达式不接受以下模式:

3.
.3
0..3
.۱۲

G
Giri babu vuppula

正则表达式 regex = 新正则表达式 ("^[0-9]{1,4}=[0-9]{1,4]$")


你能解释一下你的答案吗?您会注意到,这个问题的其他答案对正则表达式的每个部分的作用都有一定程度的解释,而这是您所缺乏的。

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅