正则表达式匹配表示西班牙语日期的字符串

我需要使用正则表达式来验证表示完整日期字符串的字符串(用西班牙语编写)。 。我不需要验证实际字符串是否是有效日期(闰年等等)。</ p>

字符串如下所示:</ p>

  23 de septiembre del 2003 

23 de septiembre de 1965
</ code> </ pre>

如果年份大于2000,则为“del” 是在年之前使用,如果没有使用'de'这个词... </ p>

我做了我的研究,并找到了如何得到前2位数字:</ p>

$ pattern =([0-9] +);
</ code> </ pre>

..然后我迷失了如何把它们放在一起 ... </ p>

帮助!</ p>
</ div>

展开原文

原文

I need to use a regular expression to validate a string (written in spanish) that represents a full date string... I don't need to validate if the actual string is a valid date (leap years, etc...)

The string looks like this:

23 de septiembre del 2003

23 de septiembre de 1965

If the year is greater then 2000, the the word 'del' is use prior to the year, if not the word 'de' is use...

i did my research and found how to get the first 2 digits:

$pattern = ([0-9]+);

.. then i got lost on how to put it all together...

Help !

dongya2578
dongya2578 〜((\d{1,2})de([a-z]+)(del?)(\d{4}))〜
接近 8 年之前 回复

1个回答



  / \ b \ d {1,2} de [az] +(de 1 \ d {3} | del  2 \ d {3})/ i 
</ code> </ pre>

说明:</ p>

  \ b ...需要一个字 边界,因为下面的字符是一个数字
(因而是一个单词字符),只有当日期是
前面的字符不是字母而不是数字而且
不是下划线时,这只会匹配
\ d {1,2} ...一个或两个数字
de ...字面意思是“de”
[az] + ...来自az的任何字母,至少一次但是任意次数
(de 1 \ d {3} ...字面意思是“de”后跟“1”和另外3位
| ...或
del 2 \ d {3})...字面意思是“del”后跟“2”并且 另外3个数字

i ...使整个事情不区分大小写(如果需要,可以省略)
</ code> </ pre>

另请注意,所有空格都在 正则表达式与任何其他角色一样对待。</ p>

或者,inste 广告 [az] + </ code>您可以指定有效月份的列表,例如</ p>

  / \ b \ d {1,2} de(..  。| septiembre | ...)(de 1 \ d {3} | del 2 \ d {3})/ i 
</ code> </ pre>

(替换... 更多月份命名 | </ code>来分隔它们)</ p>
</ div>

展开原文

原文

/\b\d{1,2} de [a-z]+ (de 1\d{3}|del 2\d{3})/i

Explanation:

\b              ... requires a word boundary, since the following character is a digit
                    (and thus a word character) this will only match if the date is
                    preceded by a character that is not a letter, not a digit and
                    not an underscore
\d{1,2}         ... one or two digits
de              ... literally "de"
[a-z]+          ... any letter from a-z, at least once but an arbitrary number of times
(de 1\d{3}      ... literally "de" followed by "1" and 3 more digits
|               ... or
del 2\d{3})     ... literally "del" followed by "2" and 3 more digits

i               ... make the whole thing case-insensitive (you can omit this if needed)

Also note, that all spaces in the regex are treated just like any other character.

Alternatively, instead of [a-z]+ you could specify a list of valid months like

/\b\d{1,2} de (...|septiembre|...) (de 1\d{3}|del 2\d{3})/i

(replace ... with more month names an | to separate them)

doujiabing1228
doujiabing1228 是的,后者会起作用。 但你可以这样简化[1-9] | [12] [0-9] | 3 [01] ......虽然这不是什么大不了的事
接近 8 年之前 回复
douyujun0152
douyujun0152 我不确定日期是否应该是字符串中唯一的东西,或者是否应该在更长的字符串中找到日期。
接近 8 年之前 回复
dpkpaxhzffixp8426
dpkpaxhzffixp8426 完善! 我认为匹配1到31的数字的正确方法是[1-9] | [1-2] [0-9] | 3 [0-1]
接近 8 年之前 回复
douxiaqin2062
douxiaqin2062 模式应该以^开头并以$结尾。 像这样'/ ^ \ d {1,2} de [a-z] +(de 1 \ d {3} | del 2 \ d {3})$ / i'
接近 8 年之前 回复
doujugu1722
doujugu1722 谢谢m-buettner。 一个有效! 顺便说一句,我调查它并改变表达式,因此它只接受1到31之间的天数:/ [1-31] de [az] +(de 1 \ d {3} | del 2 \ d {3 } / i ...我相信[1-31]你是怎么做的吧?
接近 8 年之前 回复
dsla94915
dsla94915 原来如此。 它匹配,因为它只匹配“34”并忽略2.你可以在前面添加一个单词边界(我会把它编辑成答案)
接近 8 年之前 回复
donpb2823
donpb2823 也许PHP不会将其视为数字而是字符串?
接近 8 年之前 回复
doo6568
doo6568 '234 de enero del 2003'匹配......看起来即使第一部分是3位数,表达式也会有效? 为什么?
接近 8 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问