Avatar billede s_m Seniormester
17. januar 2023 - 14:58 Der er 6 kommentarer

REGEX

Hej

Er der en, som kan hjælpe med regex-kodning til følgende:
I denne tekststreng:

"Aaaa Bbbb - Ccccc Ddddd"

skal jeg have returneret:

"Aaaa Bbbb"

Altså ALLE tal/bogstaver/tegn INDEN "mellemrum minus" (" -") - den blanke før minus må ikke komme med.
Avatar billede arne_v Ekspert
17. januar 2023 - 17:33 #2
(.*) \-.*
altså: noget mellemrum bindestreg noget
det du skal bruge er i gruppe 1
Avatar billede bvirk Guru
17. januar 2023 - 21:02 #3
#1
'må ikke komme' hvor - der er forskellige regex engines - de er ret ens mht. mathes men det skrives forskelligt i måden det anvendes på. Nolge har en decideret strenghåndtering så backslaches ikke skal substitures.
Nåh - men hvis man vil have noget af det første har mange sprog en replace hvormed et mach på det modsatte smides væk - al la replace(obj,"\s*-.*$","")
Avatar billede bvirk Guru
17. januar 2023 - 21:27 #4
//c++
#include <iostream>
#include <string>
#include <regex>

using namespace std;

...
regex afterFirstTilde("\\s*-.+$");
cout << regex_replace("Aaaa Bbbb - Ccccc Ddddd",afterFirstTilde,"") << endl;
Avatar billede arne_v Ekspert
18. januar 2023 - 01:24 #5
Der er forskellige regex syntaxer.

Der er forskellige sprog/runtime support for regex.

Og der er forskellige tilgang. Som illusteret her vil jeg fiske det f'rste ud mens bvirk vil fjerne det sidste - det kan give samme resultat (der er nogle sm[ forskelle i de to faktiske regex udtryk).

Hvis jeg skal lave et par eksempler:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexFun {
    public static void main(String[] args) {
        String s1 = "Aaaa Bbbb - Ccccc Ddddd";
        Matcher m = Pattern.compile("(.*) -.*").matcher(s1);
        if(m.find()) {
            String s2 = m.group(1);
            System.out.println("|" + s2 + "|");
        } else {
            System.out.println("No match");
        }
    }
}


using System;
using System.Text.RegularExpressions;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            string s1 = "Aaaa Bbbb - Ccccc Ddddd";
            Match m = Regex.Match(s1, "(.*) -.*");
            if(m.Success)
            {
                string s2 = m.Groups[1].Value;
                Console.WriteLine("|" + s2 + "|");
            }
            else
            {
                Console.WriteLine("No match");
            }
            Console.ReadKey();
        }
    }
}


import re

s1 = 'Aaaa Bbbb - Ccccc Ddddd'
m = re.match('(.*) -.*', s1)
if m:
    s2 = m.group(1)
    print('|' + s2 + '|')
else:
    print('No match')
Avatar billede arne_v Ekspert
18. januar 2023 - 02:23 #6
Generelt med hensyn til regex så er der en gammel vits:

Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester