我想编写一个将CamelCase转换为人类可读名称的方法.
这是测试用例:
public void testSplitCamelCase() {
assertEquals("lowercase", splitCamelCase("lowercase"));
assertEquals("Class", splitCamelCase("Class"));
assertEquals("My Class", splitCamelCase("MyClass"));
assertEquals("HTML", splitCamelCase("HTML"));
assertEquals("PDF Loader", splitCamelCase("PDFLoader"));
assertEquals("A String", splitCamelCase("AString"));
assertEquals("Simple XML Parser", splitCamelCase("SimpleXMLParser"));
assertEquals("GL 11 Version", splitCamelCase("GL11Version"));
}
Run Code Online (Sandbox Code Playgroud) 我在C#程序中有以下正则表达式,并且难以理解它:
(?<=#)[^#]+(?=#)
Run Code Online (Sandbox Code Playgroud)
我会把它分解为我认为我理解的内容:
(?<=#) a group, matching a hash. what's `?<=`?
[^#]+ one or more non-hashes (used to achieve non-greediness)
(?=#) another group, matching a hash. what's the `?=`?
Run Code Online (Sandbox Code Playgroud)
所以这个问题我已经是?<=和?<组成部分.从阅读MSDN,?<name>用于命名组,但在这种情况下,尖括号永远不会关闭.
我?=在文档中找不到,搜索它真的很难,因为搜索引擎大多会忽略那些特殊的字符.
我有这样的字符串String str = "la$le\\$li$lo".
我想拆分它以获得以下输出"la","le\\$li","lo".\ $是一个$转义所以它应该留在输出中.
但是,当我做 str.split("[^\\\\]\\$")ÿ得到"l","le\\$l","lo".
从我得到的我的正则表达式匹配$和i $然后删除.知道如何让我的角色回来吗?
谢谢
有没有一种简单的方法将此字符串"TopLeft"拆分为"Top"和"Left"
我正在寻找一种方法将PascalCase字符串(例如"MyString")拆分为单独的单词 - "My","String".另一个用户提出了这个问题bash,但我想知道如何使用常规正则表达式或至少在.NET中.
如果你能找到一种方法来分割(并且可选地大写)camelCase字符串:例如,"myString"变成"my"和"String",可以选择大写/小写字符串中的一个或两个.
现在,我正在用分裂,切片和内爆实现这个:
$exploded = implode(' ',array_slice(preg_split('/(?=[A-Z])/','ThisIsATest'),1));
//$exploded = "This Is A Test"
Run Code Online (Sandbox Code Playgroud)
更漂亮的版本:
$capital_split = preg_split('/(?=[A-Z])/','ThisIsATest');
$blank_first_ignored = array_slice($capital_split,1);
$exploded = implode(' ',$blank_first_ignored);
Run Code Online (Sandbox Code Playgroud)
但是,问题是当你有输入时'SometimesPDFFilesHappen',我的实现将(错误地)解释为'Sometimes P D F Files Happen'.
我怎样(简单地)让我的脚本压缩'P D F'到'PDF'?
我应该分开的资格是从第一个首都开始,到最后一个结束,以适应下一个词.
是的,我知道存在一些含糊不清的内容,例如'ThisIsAPDFTest',会被解释为'This Is APDF Test'.但是,我无法想到一种"聪明"的方法来避免这种情况,因此这是一种可接受的妥协.
在我回答这个问题,我提到,我们用UpperCamelCase解析得到不装饰的Description属性的枚举常量的描述,但它是天真的,并没有适用于所有情况.我重温了它,这就是我提出的:
var result = Regex.Replace(camelCasedString,
@"(?<a>(?<!^)[A-Z][a-z])", @" ${a}");
result = Regex.Replace(result,
@"(?<a>[a-z])(?<b>[A-Z0-9])", @"${a} ${b}");
Run Code Online (Sandbox Code Playgroud)
第一次更换寻找一个大写字母,然后是小写字母,除非大写字母是字符串的开始(以避免回去和修剪),并增加了前面的空间.它处理您的基本UpperCamelCase标识符,并领导像FDICInsured这样的全高级缩写词.
第二个替换查找小写字母后跟一个大写字母或数字,并在两者之间插入一个空格.这是处理中间或结尾的首字母缩写词或数字的特别,但通常情况下在标识符(除领先的数字,这通常被禁止C风格的语言反正).
运行一些基本的单元测试,这两者的结合正确分离以下所有标识符:NoDescription,HasLotsOfWords,AAANoDescription,ThisHasTheAcronymABCInTheMiddle,MyTrailingAcronymID,TheNumber3,IDo3Things,IAmAValueWithSingleLetterWords和基本(其中没有任何空格添加).
所以,我首先发布这个与其他可能认为有用的人分享,然后再问两个问题:
任何人都会看到一个符合常见的CamelCase-ish约定的情况,这种情况不会被正确地分成友好的字符串吗?我知道它不会缩略语相邻(FDICFCUAInsured)分开,资产重组"正确"的缩略语驼峰像FdicInsured,或大写lowerCamelCased标识符的第一个字母(但一个很容易补充- result = Regex.Replace(result, "^[a-z]", m=>m.ToString().ToUpper());).还要别的吗?
任何人都可以看到一种方式来做出这样的陈述,或者更优雅吗?我正在寻找组合替换调用,但由于他们对匹配执行两个不同的事情,因此无法使用这两个字符串完成.它们可以组合成一个方法链,在String上使用RegexReplace扩展方法,但任何人都可以想到更好吗?
我有一个字符串:
strArray= "-------9---------------";
Run Code Online (Sandbox Code Playgroud)
我想从字符串中找到9.字符串可能是这样的:
strArray= "---4-5-5-7-9---------------";
Run Code Online (Sandbox Code Playgroud)
现在我只想找出字符串中的数字.我需要值9,4,或者这样的东西而忽略' - '.我尝试了以下方法:
strArray= strignId.split("-");
Run Code Online (Sandbox Code Playgroud)
但是它会出错,因为有多个' - '并且我没有得到我的输出.那么java应该使用什么功能呢?
我的输入和输出应如下:
input="-------9---------------";
output="9";
input="---4-5-5-7-9---------------";
output="45579";
Run Code Online (Sandbox Code Playgroud)
我该怎么办?
我试图在1.5 + 4.2*(5 + 2)等方程式上运用正则表达式与运算符 - +*/所以输出将输入到数组中,这样我就可以单独解析
[0]1.5
[1]+
[2]4.2
[3]*
[4](
[5]5
[6]+
[7]2
[8])
Run Code Online (Sandbox Code Playgroud)
我已经发现,在\b将工作于1+2+3但是如果我有它不会分裂小数点.
我试过分裂,\b(\.\d{1,2})但它没有分裂小数点
regex ×8
java ×4
string ×3
.net ×2
c# ×2
camelcasing ×1
humanize ×1
lookahead ×1
lookaround ×1
lookbehind ×1
math ×1
php ×1
split ×1