Vinnaren i pepparkakshustävlingen!
2017-06-03, 20:01
  #1
Medlem
Jag är ute efter ett reguljärt uttryck som ska matcha alla strängar som innehåller 7 siffror, varken fler eller färre.

Kod:
"text6360293642" ska returnera falskt
"text5169201" ska returnera sant
"text123" ska returnera falskt
"text1234567 ännu mer text" ska returnera sant

Sedan vill jag med javascript radera allt i strängen som inte innehåller de sju siffrorna.

Om någon är duktig och villig att hjälpa mig med det, så vore jag mycket tacksam
Citera
2017-06-03, 20:29
  #2
Medlem
Kaustis avatar
Citat:
Ursprungligen postat av fyma
Jag är ute efter ett reguljärt uttryck som ska matcha alla strängar som innehåller 7 siffror, varken fler eller färre.

Kod:
"text6360293642" ska returnera falskt
"text5169201" ska returnera sant
"text123" ska returnera falskt
"text1234567 ännu mer text" ska returnera sant

Sedan vill jag med javascript radera allt i strängen som inte innehåller de sju siffrorna.

Om någon är duktig och villig att hjälpa mig med det, så vore jag mycket tacksam

Regex som bör fungera: [0-9]{7}
Citera
2017-06-03, 20:37
  #3
Medlem
Följande löser problemet för dina strängar:
Kod:
var myString = "text5169201";
if(myString.match(/^\D*\d{7}\D*$/)) {
	myString = myString.match(/\d{7}/)[0];
}
Vad du vill göra om det inte är uppfyllt får du bestämma själv.

Angående Kaustis förslag så kan det funka, men då kan flera grupper av 7 siffror förekomma i strängen.
Regex-uttrycker [0-9]{7} kommer att matcha även strängen
text5169201test1234567
Regex-uttrycket /^\D*\d{7}\D*$/ kommer inte godkänna den strängen.
Citera
2017-06-03, 22:17
  #4
Medlem
Vi är nästan där

Jag vill att den ska kunna matcha strängen text5169201test1234567

Men om jag använder [0-9]{7} så matchas även 1234567891011, vilket jag inte vill.
Däremot om strängen är 1234567891011ochSedanLiteAndraTecken1234567 så ska den matcha.
__________________
Senast redigerad av fyma 2017-06-03 kl. 22:20.
Citera
2017-06-03, 23:51
  #5
Medlem
Citat:
Ursprungligen postat av fyma
Vi är nästan där

Jag vill att den ska kunna matcha strängen text5169201test1234567

Men om jag använder [0-9]{7} så matchas även 1234567891011, vilket jag inte vill.
Däremot om strängen är 1234567891011ochSedanLiteAndraTecken1234567 så ska den matcha.
Lite förvirrande vad det är du vill ha ut. Först skrev du "alla strängar som innehåller 7 siffror". Det verkar dock som att du vill matcha alla strängar som har minst en sekvens av exakt 7 siffror, omgivna av icke-siffror eller start/slut av strängen. Korrekt? I sådana fall kan du använda dig av lookahead och lookbehind på följande sätt:

Kod:
.*(?<!\d)(\d{7})(?!\d).*
I tal står det ungefär "0 eller fler av vad som helst, följt av sju siffror som föregås och följs av någonting som inte är en siffra, och sedan 0 eller fler av vad som helst". Notera att lookaheads och lookbehinds är rätt dyra, så det kan vara mer effektivt att köra på någonting i stil med detta istället (om prestanda är relevant):
Kod:
.*([^\d]|^)(\d{7})([^\d]|$).*
Här står det istället "0 eller fler av vad som helst, följt av något som inte är en siffra ELLER början av strängen, följt av sju siffror, följt av någonting som inte är en siffra ELLER slutet av strängen, följt av 0 eller fler av vad som helst".

Har inte direkt tänkt tänkt detta superordentligt men jag tror att det borde fungera.

OBS: \d är ekvivalent med [0-9]

EDIT: För att göra det tydligt att man vill matcha hela strängen bör man lägga till ^ i början och $ i slutet av sitt regex. Det spelar dock ingen egentlig roll här då båda dessa antingen kommer matcha hela strängen eller ingenting av den, pga .* i början och slut.

EDIT2: Missade att du ville radera allt i strängen som inte innehåller de sju siffrorna. Det går inte att radera någonting ur en sträng då strängar är immutable, men du bör kunna plocka ut gruppen i mitten (paranteser i regex skapar en grupp, jag parantesade ihop 7-siffrorsmatchningarna) på något sätt. Jag kan inte JS så vet inte exakt hur, men det bör vara enkelt.
__________________
Senast redigerad av Tengilbefriaren 2017-06-04 kl. 00:00.
Citera
2017-06-03, 23:59
  #6
Medlem
oops...
Citera
2017-06-04, 00:07
  #7
Medlem
Citat:
Ursprungligen postat av fyma
Vi är nästan där

Jag vill att den ska kunna matcha strängen text5169201test1234567

Men om jag använder [0-9]{7} så matchas även 1234567891011, vilket jag inte vill.
Däremot om strängen är 1234567891011ochSedanLiteAndraTecken1234567 så ska den matcha.
Din kravspec är fortfarande otydlig, jag vet inte exakt vad du är ute efter. Nästföljande variant kanske är lättare för dig att arbeta med, så kan du modifiera själv?

Kod:
var matches = myString.match(/[\d]+/g)
  	.filter(function(group) {return group.length == 7})
match-funktionen returnerar alla grupper bestående av 1 siffra eller längre.
filter-funktionen returnerar i sin tur alla element i den arrayen som som är precis av längd 7.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback