可以使用正则表达式计算此函数的反函数吗?

时间:2011-03-14 16:22:45

标签: php regex

我有一个函数将类名(西班牙文!)从单数形式转换为复数形式:

function pluralize($element) {
    return preg_replace('/^([A-Za-z][a-z]*)([A-Z]|$)/', '\1s\2', $element);
}

现在我想定义这个函数的逆。以下功能是否有效?

function singularize($plural) {
    return preg_replace('/^([A-Za-z][a-z]*)(s)([A-Z]|$)/', '\1\3', $element);
}

2 个答案:

答案 0 :(得分:1)

它应该可以正常工作,但在第二种模式中你不需要围绕s的括号。你还需要记住,如果你有多个s,那么这两种模式都不会关心它。因此,第一个模式将ClassX更改为ClasssX,第二个模式将其更改为ClassX。请记住一些事情。

答案 1 :(得分:1)

通常,只有's'被排除在[a-z] *位置之外 在创建类名时。

这意味着[a-z] *需要排除's'。像[a-rt-z]*一样 然后这些可能会起作用。

/^([A-Za-z][a-rt-z]*) ([A-Z]|$)/x
/^([A-Za-z][a-rt-z]*)(s)([A-Z]|$)/x

编辑 - 否则(用你拥有的东西),你必须跟踪每个类名所处的状态。即:如果它没有被复数化,它就不能被单一化,否则就是额外的's'可能会从原始班级名称中删除。

上面的正则表达式不需要维持状态,但它们的形式有限 最好在类中添加一个区别字符,以区别于单数/复数状态。如果得到支持,也许是一个下划线。否则将无法控制或其他可识别的标记来判断哪个是哪个。