我正在尝试为PHP中的名称编写一个合理宽松的验证器,我的第一次尝试包含以下模式:
// unicode letters, apostrophe, hyphen, space
$namePattern = "/^([\\p{L}'\\- ])+$/";
Run Code Online (Sandbox Code Playgroud)
这最终传递给了一个电话preg_match().据我所知,这适用于你的vanilla ASCII字母表,但似乎惹上像Ă或张这样的尖锐字符.
这个模式本身有什么问题吗?也许我期待\p{L}比我想的更多的工作?
或者它与传入输入的方式有关?我不确定它是否相关,但我确实确保在表单页面上指定UTF8编码.
我正在尝试使用PCRE正则表达式并在SED中使用它,但我遇到了一些问题.请注意,这个问题代表了一个更大的问题(如何将PCRE正则表达式转换为与SED一起使用)所以问题不仅仅是关于下面的示例,而是关于如何在SED正则表达式中使用PCRE正则表达式作为一个整体.
此示例从一行中提取电子邮件地址,并将其替换为"[emailaddr]".
echo "My email is abc@example.com" | sed -e 's/[a-zA-Z0-9]+[@][a-zA-Z0-9]+[\.][A-Za-z]{2,4}/[emailaddr]/g'
Run Code Online (Sandbox Code Playgroud)
我试过以下替换正则表达式:
([a-zA-Z0-9]+[@][a-zA-Z0-9]+[\.][A-Za-z]{2,4})
[a-zA-Z0-9]+[@][a-zA-Z0-9]+[\.][A-Za-z]{2,4}
([a-zA-Z0-9]+[@][a-zA-Z0-9]+[.][A-Za-z]{2,4})
[a-zA-Z0-9]+[@][a-zA-Z0-9]+[.][A-Za-z]{2,4}
Run Code Online (Sandbox Code Playgroud)
我已经尝试将sed的分隔符从s/find/replace/g更改为s | find | replace | g,如此处所述(堆栈溢出:pcre regex到sed regex).
我仍然无法弄清楚如何在SED中使用PCRE正则表达式,或者如何将PCRE正则表达式转换为SED.任何帮助都会很棒.
如何将n> 0的^ nb ^ nc ^ n与PCRE匹配?
以下情况应符合:
abc
aabbcc
aaabbbccc
Run Code Online (Sandbox Code Playgroud)
以下情况不符合:
abbc
aabbc
aabbbccc
Run Code Online (Sandbox Code Playgroud)
这是我"尝试过"的东西; /^(a(?1)?b)$/gmx但这匹配n> 0的^ nb ^ n:
ab
aabb
aaabbb
Run Code Online (Sandbox Code Playgroud)
注意:这个问题是一样的这一个与语言的变化.
试图连续重复的字母出现两次或三次.无法使用ERE找到使用量词和捕获组的方法
$ grep --version | head -n1
grep (GNU grep) 2.25
$ # consecutive repeated letters occurring twice
$ grep -m5 -xiE '[a-z]*([a-z])\1[a-z]*[a-z]*([a-z])\2[a-z]*' /usr/share/dict/words
Abbott
Annabelle
Annette
Appaloosa
Appleseed
$ # no output for this, why?
$ grep -m5 -xiE '([a-z]*([a-z])\2[a-z]*){2}' /usr/share/dict/words
Run Code Online (Sandbox Code Playgroud)
与工作-P虽然
$ grep -m5 -xiP '([a-z]*([a-z])\2[a-z]*){2}' /usr/share/dict/words
Abbott
Annabelle
Annette
Appaloosa
Appleseed
$ grep -m5 -xiP '([a-z]*([a-z])\2[a-z]*){3}' /usr/share/dict/words
Chattahoochee
McConnell
Mississippi
Mississippian
Mississippians
Run Code Online (Sandbox Code Playgroud)
感谢Casimir et Hippolyte提出更简单的输入和正则表达式来测试这种行为
$ echo 'aazbb' | grep -E '(([a-z])\2[a-z]*){2}' || …Run Code Online (Sandbox Code Playgroud) 我需要一个匹配UTF-8字母和数字的正则表达式,破折号(-)但不匹配下划线(_),我尝试了这些愚蠢的尝试但没有成功:
([\w-^_])+([\w^_]-?)+(\w[^_]-?)+这\w是简写[A-Za-z0-9_],但如果我有u修饰符集,它也匹配UTF-8字符.
任何人都可以帮我解决这个问题吗?
我有一个PHP库,它使用了许多带有\P多字节字符串表达式的正则表达式,例如
((((?:\P{M}\p{M}*)+?)|(\'[^\']*\')|(\"[^\"]*\"))!)?\$?([a-z]{1,3})\$?(\d+)
Run Code Online (Sandbox Code Playgroud)
虽然这适用于大多数版本,但我有一些regexp返回错误的报告.
根据操作平台,PCRE的错误消息是:
编译失败:PCRE在偏移量n处不支持\ L,\ l,\ N,\ P,\ p,\ U,\ u或\ X
要么
编译失败:尚未在偏移量n处编译对\ P,\ p和\ X的支持
我知道我可以在我的代码的开头测试一个正则表达式,它使用\P并捕获返回的错误,然后使用该响应设置兼容性标志并提供降级(非UTF-8)正则表达式而不\P在主要内部我的代码的主体基于该兼容性标志.
我想知道是否有任何识别是否PCRE已经没有内置简单的方式--enable-unicode-properties或--enable-utf8配置交换机.PHP提供对PCRE_VERSION常量的访问,但这无助于确定是否\P启用了支持.
该模式(?<!(asp|php|jsp))\?.*适用于PCRE,但它在Python中不起作用.
那么我该怎么做才能让这个正则表达式在Python中运行?(Python 2.7)
我刚刚将我的MacBook Pro升级为Mavericks并且我的本地Ruby on Rails开发环境没有直接运行,当我访问时localhost我看到It works!并记得我需要启动Phusion Passenger,所以当我运行passenger start它时检查所有先决条件并失败当它到达PCRE开发标题时:
* Checking for PCRE development headers...
Found: no
Run Code Online (Sandbox Code Playgroud)
它告诉我去http://www.pcre.org/下载它们所以我从这里下载了8.33 到我的Downloads文件夹,所以我解压缩它,cd'd到文件夹然后运行:
./configure
make
make install
Run Code Online (Sandbox Code Playgroud)
然后cd'回到我桌面上的rails应用程序目录并重新运行passenger start但它仍然是相同的.尝试了一个新的终端窗口,但没有任何区别.
我之前必须这样做才能让我的开发环境工作,但这次似乎无法解决它.
我也尝试了,brew install pcre但它说Warning: pcre-8.33 already installed.
当我分析Snort的正则表达式集我发现了一个非常奇怪的字符类语法,像[\x80-t]或者[\x01-t\x0B\x0C\x0E-t\x80-t],我想不出(真不知道)什么-t手段.我甚至不知道它是标准PCRE还是某种Snort扩展.
这是一些包含这些字符类的正则表达式:
/\x3d\x00\x12\x00..........(.[\x80-t]|...[\x80-t])/smiR
/^To\x3A[^\r\n]+[\x01-t\x0B\x0C\x0E-t\x80-t]/smi
Run Code Online (Sandbox Code Playgroud)
PS:请注意,\x80-t标准方式甚至不是有效范围,因为字符t是\ x74.
注释对我的回答这个问题,这应该使用得到期望的结果strsplit没有,即使它似乎在一个字符向量正确匹配的第一个和最后逗号.这可以使用gregexpr和证明regmatches.
那么为什么strsplit在这个例子中对每个逗号进行拆分,即使regmatches只返回同一个正则表达式的两个匹配?
# We would like to split on the first comma and
# the last comma (positions 4 and 13 in this string)
x <- "123,34,56,78,90"
# Splits on every comma. Must be wrong.
strsplit( x , '^\\w+\\K,|,(?=\\w+$)' , perl = TRUE )[[1]]
#[1] "123" "34" "56" "78" "90"
# Ok. Let's check the positions of matches for this regex …Run Code Online (Sandbox Code Playgroud)