Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 与n个数字字符以及1或2个非数字字符匹配的正则表达式_Php_Javascript_Regex - Fatal编程技术网

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]+)
模式来匹配字符串中的数字,但现在有一个奇怪的边缘大小写。我想匹配以下内容:

123
456
.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将非常好。我可以提供更多的例子,但关键是字符串是另一个数字