Php 与n个数字字符以及1或2个非数字字符匹配的正则表达式
我一直在使用标准的Php 与n个数字字符以及1或2个非数字字符匹配的正则表达式,php,javascript,regex,Php,Javascript,Regex,我一直在使用标准的([0-9]+)模式来匹配字符串中的数字,但现在有一个奇怪的边缘大小写。我想匹配以下内容: 123 456 .123 123. %123 31日 第14位 第二个 100.55 555.10 在上述情况下,非数字字符为: . % s h n d 但它们可以是各种各样的角色。 想法 JS或PHP会很好。如果您正在寻找预期模式的验证(如日期?),您可以这样做: [\d.%]*(nd|st|th){0,1} 如果您知道%的位置是前导的,或者您只有一个小数点,或者如果您不需要st/n
([0-9]+)
模式来匹配字符串中的数字,但现在有一个奇怪的边缘大小写。我想匹配以下内容:
123456
.123
123.
%123
31日
第14位
第二个
100.55
555.10 在上述情况下,非数字字符为:
.
%
s
h
n
d 但它们可以是各种各样的角色。
想法
JS或PHP会很好。如果您正在寻找预期模式的验证(如日期?),您可以这样做:
[\d.%]*(nd|st|th){0,1}
如果您知道%的位置是前导的,或者您只有一个小数点,或者如果您不需要st/nd/etc,您可以这样进行优化:
([%]){0,1}[\d]*((((\.[\d]+){0,1}){0,1})|((nd|st|th|rd){0,1}))
我仍然没有在任何地方处理空间,但我想你可以看看如何添加它?此外,您可能希望确保第1名对第11名,等等-如果您担心进一步改进验证,可以开始选择类似日期的内容(您可能可以通过谷歌更好地搜索):
如果您希望验证您期望的模式(如日期?),则可以使用一些额外的括号,以尽可能清楚地说明问题。
[\d.%]*(nd|st|th){0,1}
如果您知道%的位置是前导的,或者您只有一个小数点,或者如果您不需要st/nd/etc,您可以这样进行优化:
([%]){0,1}[\d]*((((\.[\d]+){0,1}){0,1})|((nd|st|th|rd){0,1}))
我仍然没有在任何地方处理空间,但我想你可以看看如何添加它?此外,您可能希望确保第1名对第11名,等等-如果您担心进一步改进验证,可以开始选择类似日期的内容(您可能可以通过谷歌更好地搜索):
这里有一些额外的括号,以便尽可能清楚地说明问题我试图为所有情况创建一些规则:
(\d+(?:\.\d*)?) // 123 ; 123. ; 123.45
([%.]\d+) // %123 ; .123
(\d+(?:st|nd|th)) // 31st ; 2nd ; 14th
然后混合:
((?:\d+(?:\.\d*)?)|(?:[%.]\d+)|(?:\d+(?:st|nd|th)))
如果您想要更短的内容,只需使用
([%.\dshnd]+)
,但这将捕获许多不需要的条目,如%%123%%我尝试为所有情况创建了一些规则:
(\d+(?:\.\d*)?) // 123 ; 123. ; 123.45
([%.]\d+) // %123 ; .123
(\d+(?:st|nd|th)) // 31st ; 2nd ; 14th
然后混合:
((?:\d+(?:\.\d*)?)|(?:[%.]\d+)|(?:\d+(?:st|nd|th)))
如果您想要更短的内容,可以简单地使用([%.\dshnd]+)
,但这将捕获许多不需要的条目,例如%%123%%
从一个模式开始,您可以得到想要的内容:
\d+
现在还需要匹配十进制数,因此展开选项:
这一个匹配后跟可选小数点的数字
\d+\.?
这个匹配十进制数:
\d*\.\d+
将两者结合起来将为您提供一个稳定的数字匹配模式(如果您不想匹配像000.0000
这样的数字,这可能仍然存在问题):
现在是棘手的部分。您需要准确地确定数字的前缀或后缀可能是哪些其他字符
鉴于这个例子,我将做出以下假设:
%
可以在小数前加前缀,但不加后缀
st
、nd
、rd
和th
只能作为整数的后缀
鉴于这些假设:
%
字符可以选择匹配小数:
(?:%?(?:\d+\.?|\d*\.\d+))
带后缀的整数可以匹配(这不会验证后缀,1nd
将有效):
将这两种模式结合起来会产生:
(?:(?:%?(?:\d+\.?|\d*\.\d+))|(?:\d+(?:st|nd|rd|th)))
当然,您可能希望将匹配限制为整个字符串:
/^(?:(?:%?(?:\d+\.?|\d*\.\d+))|(?:\d+(?:st|nd|rd|th)))$/
从一个模式开始,你可以得到你想要的:
\d+
现在还需要匹配十进制数,因此展开选项:
这一个匹配后跟可选小数点的数字
\d+\.?
这个匹配十进制数:
\d*\.\d+
将两者结合起来将为您提供一个稳定的数字匹配模式(如果您不想匹配像000.0000
这样的数字,这可能仍然存在问题):
现在是棘手的部分。您需要准确地确定数字的前缀或后缀可能是哪些其他字符
鉴于这个例子,我将做出以下假设:
%
可以在小数前加前缀,但不加后缀
st
、nd
、rd
和th
只能作为整数的后缀
鉴于这些假设:
%
字符可以选择匹配小数:
(?:%?(?:\d+\.?|\d*\.\d+))
带后缀的整数可以匹配(这不会验证后缀,1nd
将有效):
将这两种模式结合起来会产生:
(?:(?:%?(?:\d+\.?|\d*\.\d+))|(?:\d+(?:st|nd|rd|th)))
当然,您可能希望将匹配限制为整个字符串:
/^(?:(?:%?(?:\d+\.?|\d*\.\d+))|(?:\d+(?:st|nd|rd|th)))$/
这一款适合您的需要:
^([.]|%)?\d+(?)?
^#字符串的开头
([.]|%)?#或%{0或1次}
\d+#任意数字{1或更多次}
(
((?
请注意,JS将无法理解此regexp,因为它不支持lookbehinds(?此项适合您的需要:
^([.]|%)?\d+(?)?
^#字符串的开头
([.]|%)?#或%{0或1次}
\d+#任意数字{1或更多次}
(
((?
请注意,JS无法理解这个regexp,因为它不支持lookbehinds(?是不是%123
?通常百分比是123%
,而这似乎是唯一的例外,这似乎有点奇怪。我想我应该补充一点:只有当您有一个定义良好的字符串模式要匹配时,才应该使用正则表达式。此时,您还没有提供足够的信息来准确确定模式将匹配您所追求的。此外,标记您将使用正则表达式的语言也很重要。Perl使用与PHP不同的语法使用与JavaScript不同的语法使用与C#不同的语法…感谢ZZZBOV提出的问题。您是对的:我应该指定语言。JS或PHP将非常好。我可以提供更多的例子,但关键是字符串是另一个数字