Ste*_*der 9 php regex camelcasing
所以我被困 - 我在这里看了很多答案,但似乎没有解决我的最后一个问题.
通过带有JSON的API,我收到了一个camelcase格式的设备列表.我无法改变这一点.
我需要将这个camelcase翻译成普通语言 -
到目前为止,我已经将大部分词语分开了:
$string = "SomeEquipmentHere";
$spaced = preg_replace('/([A-Z])/', ' $1', $string);
var_dump($spaced);
string ' Some Equipment Here' (length=20)
$trimmed = trim($spaced);
var_dump($trimmed);
string 'Some Equipment Here' (length=19)
Run Code Online (Sandbox Code Playgroud)
哪个工作正常 - 但在一些设备中由缩写组成
"ABSBrakes" - 这需要ABS并与制动器分开
我无法检查彼此相邻的几个大箱,因为它会将ABS和制动器保持在一起 - 还有更多这样的,即:"CDRadio"
所以需要的是输出:
"ABS Brakes"
Run Code Online (Sandbox Code Playgroud)
有没有办法对它进行格式化,如果彼此旁边有大写字母,那么只在该序列的最后一个大写字母前添加一个空格?
我在正则表达式方面不强.
编辑
这两个贡献都很棒 - 以后来这里的人应该读两个答案
最后的问题包括以下模式:
"ServiceOK"成为"Service O K"
"ESP"变成"ES P"
仅由纯大写字母缩写组成的模式由计数小写字母的函数修复,如果没有,则将跳过preg_replace().
但正如Flying在他的回答评论中写道的那样,他的正则表达式可能会有很多实例未被覆盖,并且答案可能是不可能的 - 我不知道这对正则表达式是否是一个挑战.
可能通过添加一些"如果大写后没有小写,则不应该插入空格"规则
这是一个单调用模式,在替换字符串中不使用任何锚点、捕获组或引用: /(?:[a-z]|[A-Z]+)\K(?=[A-Z]|\d+)/
代码:(演示)
$tests = [
'SomeEquipmentHere',
'ABSBrakes',
'CDRadio',
'Valve14',
];
foreach ($tests as $test) {
echo preg_replace('/(?:[a-z]|[A-Z]+)\K(?=[A-Z]|\d+)/',' ',$test),"\n";
}
Run Code Online (Sandbox Code Playgroud)
输出:
Some Equipment Here
ABS Brakes
CD Radio
Valve 14
Run Code Online (Sandbox Code Playgroud)
这是一个更好的方法,因为没有什么需要清理的。如果有新的字符串需要考虑(破坏我的方法),请将它们留在评论中,以便我可以更新我的模式。
图案说明:
/ #start the pattern
(?:[a-z] #match 1 lowercase letter
| #or
[A-Z]+) #1 or more uppercase letters
\K #restart the fullstring match (forget the past)
(?=[A-Z] #look-ahead for 1 uppercase letter
| #or
\d+) #1 or more digits
/ #end the pattern
Run Code Online (Sandbox Code Playgroud)
编辑:
还有一些其他模式可以提供更高的准确性,包括:
/(?:[a-z]|\B[A-Z]+)\K(?=[A-Z]\B|\d+)/
Run Code Online (Sandbox Code Playgroud)
当然,上述模式无法正确处理ServiceOK
或者这个带有锚点的图案:
/(?!^)(?=[A-Z][a-z]+|(?<=\D)\d)/
Run Code Online (Sandbox Code Playgroud)
上述模式将根据OP的要求准确地分割: SomeEquipmentHere, ABSBrakes, CDRadio, Valve14, ServiceOK。ESP
*注意:随着提供更多示例字符串,可以提高模式准确性。
| 归档时间: |
|
| 查看次数: |
126 次 |
| 最近记录: |