我有一个情况。 我需要一些正则表达式,它将检查是否存在两个以上大写字符。 让我们看一个例子
Input ="HelloTest"
Output ="H ello T est"
Input ="HelloTHISisTest";
output ="H ello THIS is T est"
逻辑是每当我发现一个大写字母时我都试图打断单词。 但是,如果两个以上的大写字母采用连续形式,则不会中断。
规则是
话不会破
他们将有两个以上的连续大写字符,
它们是连续的小写字符
有什么帮助吗?
这种逻辑似乎有点不明智。 AmISure呢? 是Am I Sure还是Am IS ure? 您如何区分这两个? 还是AmISure? 那不该闯入Am Isure吗?
对于AmISure,它将是Am ure,而AmIsure将是我
那为什么不是H ello THIS is T est? 逻辑如何? 这里的统一规则是什么? 我看不到。
是的,很抱歉我已经更新了。
我认为您需要做一些编码而不是正则表达式,例如使函数接受该字符串并返回您期望的字符串。
$input ="HelloTHISisTest";
$output = preg_replace('/([A-Z]+)/', ' \1 ', $input);
$output = trim($output);
var_dump($output);
# output will be:# string(20)"H ello THIS is T est"
参见在线提琴http://ideone.com/OaQz3N
谢谢男人。 答对了!!
您可以使用以下内容:
(?:[A-Z]{2,}+|[a-z]{2,}+|[A-Z][a-z]++)(?!$)
并替换为$0。
regex101演示
正则表达式首先尝试匹配任何连续的大写字符或小写字符,最后尝试匹配单个大写字符,后跟至少1个小写字符,所有这3个字符都没有回溯且结尾处为负前瞻,以防止匹配最后一个' 字"(因此不会添加额外的空格)。
对于已编辑的问题,可以使用以下命令获取新的输出:
(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[a-z])
并替换为空格。
regex101演示
谢谢你的时间 。 答对了
@Creator是的...自从您编辑问题以来,一切都一无所有...
哦是的!!! 感谢@deceze进行通知。 头脑已经写好了。 但是,怎么说男人! XMS快活。
@Creator我认为您只需要澄清原始问题的规则即可。 如果用户批评您的逻辑,请不要屈服。 可以肯定地说,如果1.连续的大写字母,2。连续的小写字母,3。如果前两个字符失败,则第一个字符是大写字母,其余的是小写字母,则应该将连续字符保持在一起。
是的。 我之前没有更好地解释它。 ANyway已更新。 因为你有我的逻辑。 谢谢
@Creator好,现在您的示例输出与逻辑语句不匹配...第一个输出应为"Hello Test",第二个输出应为"Hello THIS is Test"
(?<=[A-Z])(?=[a-z])|(?
试试这个,看演示,用space代替
https://regex101.com/r/gQ3kS4/36
您可以匹配:
"([A-Z])(?=[A-Z])"
并替换为:
"\1"