我逐行解析一些文本,如果给定的行以任何标点符号或数字结尾,我希望布尔值返回true。
正则表达式是最好的方法还是应该迭代一组字符来匹配?像阵列一样的感觉会太大而且成本太高......
如果这确实是一个好方法,有人可以帮助我使用正则表达式吗?
function ends_with_punctuation_or_num($string){
// check if the string ends with punctuation or a number
if (/* TODO */)
return true;
else
return false;
}
答案 0 :(得分:14)
把它放入你的if-check:
preg_match("/[0-9.!?,;:]$/", $string)
这将匹配数字或字符串末尾($
)之前的任何给定标点字符。将您想要视为匹配的任何其他标点字符添加到字符类(方括号)中。
答案 1 :(得分:5)
标点符号的unicode属性为\p{P}
或\p{Punctuation}
,其数字为\pN
。
在php中你可以使用:
preg_match('/[\p{P}\p{N}]$/u', $string);
如果字符串以标点符号或数字结尾,则返回true。
查看this site。
答案 2 :(得分:1)
echo substr("abcdef", -1); // returns "f"
答案 3 :(得分:0)
您可以使用 substr function 或utf-8 mb_substr
$last = substr($string, -1);
if($last == '.' OR is_numeric($last)) {]
但是如果你使用UTF8字符串,我建议你像这样使用它
mb_internal_encoding('utf-8');
$last = mb_substr($string, -1);
if($last == '.' OR is_numeric($last)) {}
答案 4 :(得分:0)
我不确定我是否会使用正则表达式来执行此操作。这只是个人偏好,但正则表达式似乎是不必要的,而且可读性较差(它也较慢,但这可能并不重要)。我宁愿把我正在寻找的任何字符放到一个字符串中并进行比较:
$chars = '.,;\'"0123456789';
$last = substr($string, -1);
if(strpbrk($last, $chars) !== false) {}
显然,使用mb_substring()
代替Unicode。
还可以使用is_numeric()
而不是在字符串中放置数字。但我发现这更简单,更易读,以后更容易修改。