mboost-dp1
Er du regex "haj"?
- Forside
- ⟨
- Forum
- ⟨
- Programmering
Jeg sidder og pusler med en metode der kan splitte et ord i camelcase op i flere ord. Jeg er lidt kørt fast i forhold til hvor jeg gerne vil hen. Gode ideer værdsættes :)
Input:
Nuværende output:
Ønsket output:
public static string SplitCamelCase(input)
{
string[] arrStr =
Regex.Split(input, @"(?<!^)(?=[A-Z])");
return string.Join(" ", arrStr);
}
Input:
Test
TestTest
TestTest123
TestTest123Test
TestTest1Test2Test3Test
TestTestTESTTest
Nuværende output:
Test
Test Test
Test Test123
Test Test123 Test
Test Test1 Test2 Test3
Test Test T E S T Test
Ønsket output:
Test
Test Test
Test Test 123
Test Test 123 Test
Test Test 1 Test 2 Test 3 Test
Test Test TEST Test
For at drille dig har jeg valgt Java fremfor C#!
Test -> Test
TestTest -> Test Test
TestTest123 -> Test Test 123
TestTest123Test -> Test Test 123 Test
TestTest1Test2Test3Test -> Test Test 1 Test 2 Test 3 Test
TestTestTESTTest -> Test Test TEST Test
testTest -> test Test
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class CamelSplitTest {
private static Pattern re = Pattern.compile("([A-Z][a-z]+)|([A-Z]+(?=([A-Z][a-z]|[0-9]|$)))|([0-9]+)|(^[a-z]+)");
public static List<String> camelSplit(String s) {
List<String> res = new ArrayList<String>();
Matcher m = re.matcher(s);
while(m.find()) {
res.add(m.group());
}
return res;
}
public static void test(String s) {
List<String> parts = camelSplit(s);
System.out.print(s + " ->");
for(String part : parts) System.out.print(" " + part);
System.out.println();
}
public static void main(String[] args) {
String[] all = { "Test", "TestTest", "TestTest123", "TestTest123Test", "TestTest1Test2Test3Test", "TestTestTESTTest", "testTest" };
for(String one : all) {
test(one);
}
}
}
Test -> Test
TestTest -> Test Test
TestTest123 -> Test Test 123
TestTest123Test -> Test Test 123 Test
TestTest1Test2Test3Test -> Test Test 1 Test 2 Test 3 Test
TestTestTESTTest -> Test Test TEST Test
testTest -> test Test
Hvis jeg har forstået dine ønsker rigtigt, så ønsker du at splitte mellem to tegn, hvis de opfylder et følgende:
- Bogstav efterfulgt af ikke bogstav
- Ikke bogstav efterfulgt af bogstav
- Lille bogstav efterfulgt af stort bogstav
- Stort bogstav efterfulgt af stort bogstav og lille bogstav
Kan du ikke blot skrive en regex med de fire kriterier adskilt af |?
- Bogstav efterfulgt af ikke bogstav
- Ikke bogstav efterfulgt af bogstav
- Lille bogstav efterfulgt af stort bogstav
- Stort bogstav efterfulgt af stort bogstav og lille bogstav
Kan du ikke blot skrive en regex med de fire kriterier adskilt af |?
#5
Koden kan porteres 1:1 til C#:
Koden kan porteres 1:1 til C#:
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace E
{
public class Program
{
private static Regex re = new Regex("([A-Z][a-z]+)|([A-Z]+(?=([A-Z][a-z]|[0-9]|$)))|([0-9]+)|(^[a-z]+)", RegexOptions.Compiled);
public static List<string> CamelSplit(string s) {
List<String> res = new List<String>();
MatchCollection mc = re.Matches(s);
foreach(Match m in mc)
{
res.Add(m.Value);
}
return res;
}
public static void Test(string s) {
List<string> parts = CamelSplit(s);
Console.Write(s + " ->");
foreach(string part in parts) Console.Write(" " + part);
Console.WriteLine();
}
public static void Main(string[] args)
{
string[] all = { "Test", "TestTest", "TestTest123", "TestTest123Test", "TestTest1Test2Test3Test", "TestTestTESTTest", "testTest" };
foreach(string one in all)
{
Test(one);
}
Console.ReadKey();
}
}
}
Tusind tak. Fik det til at virke i c# (før jeg så din c# udgave)
public static string[] SplitCamelCase(this string str)
{
var re = new Regex("([A-Z][a-z]+)|([A-Z]+(?=([A-Z][a-z]|[0-9]|$)))|([0-9]+)|(^[a-z]+)");
var res = new List<String>();
var m = re.Match(str);
while (m.Success)
{
res.Add(m.Value);
m = m.NextMatch();
}
return res.ToArray();
}
Regulære sprog er et så fundamentalt koncept, at der ikke er nogen vej udenom det.arne_v (11) skrev:Regex er en af de ting som man enten kan lide eller ikke kan lide.
Hvilken syntaks de bedst udtrykkes i er der til gengæld delte meninger om. Jeg har hidtil stødt på tre vidt forskellige syntakser for regulære sprog.
#?.infoOvenstående tre eksempler gør selvfølgelig ikke det samme.
.*\.jpeg
!(*~)
Det ville være en joke, hvis man skulle bruge sådan en syntaks til selv de mest simple regulære udtryk. Men hvis man kan skrive simple udtryk med en af de velkendte notationer og så sætte de simple udtryk sammen til større udtryk vha. de konstruktioner, du skitserer, så ville det nok give et langt mere læsbart resultat.arne_v (12) skrev:Regex re = new Regex(Regex.UpperCase)
.FollowedBy(Regex.LowerCase.OneOrMore())
.Or(Regex.Digits.OneOrMore());
Ja - jeg tror det var mest tiltænkt som en joke.
Jeg har kendskab til forskellige varianter med forskelle i hvornår man bruger \. Der er tegn som har en speciel betydning med mindre de escapes med \, men i den anden version er det modsat for nogle tegn, som skal escapes for at have en speciel betydning.arne_v (16) skrev:Og der findes faktisk en POSIX standard (forskellene på den og Perl er ikke så store, men de er der).
Et godt regex library kunne sagtens have funktioner til at konvertere strenge fra hvert af de forskellige formater til regex objekter og funktioner som kan kombinere regex objekter til nye regex objekter.
Det var da ikke helt dumt, men ja, nok en joke, og ville uanset hvad kun kunne bruges i forholdsvis simple udtryk.arne_v (12) skrev:Jeg har iøvrigt for nyligt i et andet forum set en foreslå en fluent syntax for regex.
Både xpath og sql er "lettere at læse" end regex. Den oprindelige tanke med sql var netop at det skulle være let at læse, nærmest opbygget som en sætning. Det kunne man savne lidt i regex.
#17
Der er flere af den slags libraries, som virker ganske fint, btw :)
Jeg fandt et til PHP i sin tid, men da jeg opdagede at "alle" bruger PerlRegex anyway, saa meh :D
Et godt regex library kunne sagtens have funktioner til at konvertere strenge fra hvert af de forskellige formater til regex objekter og funktioner som kan kombinere regex objekter til nye regex objekter.
Der er flere af den slags libraries, som virker ganske fint, btw :)
Jeg fandt et til PHP i sin tid, men da jeg opdagede at "alle" bruger PerlRegex anyway, saa meh :D
Gå til top
Opret dig som bruger i dag
Det er gratis, og du binder dig ikke til noget.
Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.