2016-04-18 2 views
3

Zeichenfolge kann alles enthalten, muss jedoch einen Stern (*) in der Zeichenfolge enthalten, und das Sternchen darf sich an einer beliebigen Stelle in der Zeichenfolge befinden.Regulärer Ausdruck für eine Zeichenfolge, die nur ein Sternchen (*) enthalten sollte

Auch Zeichenfolge sollte keine Leerzeichen enthalten.

Im Folgenden sind gültige Strings:

test* 
*_test 
test*something 

Im Folgenden sind ungültig Strings:

test_** 
**_test 
test*something* 
test *something 
test * 
testsomething 
* 

Jemand bitte helfen Sie mir einen regulären Ausdruck für das oben beschriebene Szenario zu schreiben.

+0

Ist eine einstellige Zeichenfolge, die nur ein Sternchen ist, gültig? – nnnnnn

+0

Also ist es eine Zeichenfolge, die mit null oder mehr Nicht-Sternzeichen beginnt, gefolgt von einem einzelnen Stern, gefolgt von null oder mehr Nicht-Stern-Zeichen? – Pointy

+0

Asterisk kann irgendwo in der Zeichenfolge sein. Aber, sollte nur ein Sternchen haben.Wenn es kein Sternchen in der Zeichenkette gibt, dann ist es ungültig.Auch wenn mehr als ein Stern in der Zeichenkette ist, dann ist es ungültig. Wenn es ein Sternchen gibt dann ist es eine gültige Zeichenkette, die es "wahr" zurückgeben muss – Deve

Antwort

3

verwenden RegEx:

^(?!(.*?\*){2,}|.*? |\*$).*?\*.*$ 

Live Demo on Regex101

Wenn Sie es möchten Tabs erlauben (alle anderen Leerzeichen), verwenden \s anstelle einer wörtlichen Raum ():

^(?!(.*?\*){2,}|.*?\s|\*$).*?\*.*$ 

So funktioniert es:

^   # String starts with ... 
(?!  # DO NOT match if ... 
    (.*?\*) # Optional Data followed by a * 
    {2,}  # Multiple times (multiple *s) 
    |   # OR 
    .*?\s  # Optional Data followed by whitespace 
    |   # OR 
    \*$  # * then the end of the string (i.e. whole string is just a *) 
) 
.*?  # Optional Data before * 
\*   # * 
.*   # Optional Data after * 
$   # ... String ends with 

Demo:

strings = [ 
 
    'test*', 
 
    '*_test', 
 
    'test*something', 
 
    'test', 
 
    '*', 
 
    'test_**', 
 
    '**_test', 
 
    'test*something*', 
 
    'test *something', 
 
    'test *' 
 
] 
 

 
for (var i = 0; i < strings.length; i++) { 
 
    if (strings[i].match(/^(?!(.*?\*){2,}|.*?\s|\*$).*?\*.*$/)) { 
 
    document.write(strings[i] + '<br>') 
 
    } 
 
}

+0

Sie stimmen derzeit fälschlicherweise mit einer Zeichenfolge ohne Stern überein, die nicht gültig sein sollte. –

+0

Danke, ich kann nicht glauben, dass ich einen dummen Fehler gemacht habe! Aktualisierte Antwort! – Druzion

0

Sie können diese verwenden:

var regex = /^([^ \*]|\s)*\*{1}([^ \*]|\s)*$/ 

var str1 = '*abcfkdsjfksdjf'; 
var str2 = 'abcfkds*jfksdjf'; 
var str3 = 'abcfkdsjfksdjf*'; 
var str4 = 'abcfkdsjfksdjf'; 
var str5 = 'abcf*kdsjfk*sdjf'; 



console.log(regex.test(str1)); // returns true; 
console.log(regex.test(str2)); // returns true; 
console.log(regex.test(str3)); // returns true; 
console.log(regex.test(str4)); // returns false; 
console.log(regex.test(str5)); // returns false; 
+0

Vielleicht einige Tests für mehrere Asterix oder Leerzeichen werfen? – SpoonMeiser

+0

@SpoonMeiser überprüfen Sie meine aktualisierte Antwort, und danke für Ihre Rückmeldung übrigens – Ismail

+0

sollte es Registerkarten erlauben .. –

1

Sie /^[^*\s]*\*[^*\s]*$/ verwenden können, für eine strin zu überprüfen g, das genau einen Stern und keine Leerzeichen enthält. Wenn nur ein einziger Stern ungültig ist, sollten Sie einen Look-Ahead hinzufügen auf das Vorhandensein von an leats zwei Zeichen wie /^(?=.{2})[^*\s]*\*[^*\s]*$/

Siehe https://regex101.com/r/yE5zV2/1 für einige Proben zu überprüfen (zu Unit-Tests gehen)

+0

'Wenn nur ein einzelner Stern ungültig ist '?? Dein erster Regex ist genug. –

+0

@AvinashRaj nach Kommentaren eine Zeichenfolge, die nur ein einziges Sternchen enthält, sollte nicht übereinstimmen, also habe ich das aufgenommen. –

0

Die Bedingungen benötigen kaum regex (gut zu verwenden, wenn nach Leerzeichen gesucht wird).

// This is the checking function 
 
function checkStr(x) { 
 
    return (x.indexOf("*", x.indexOf("*")+1) === -1 && x.indexOf("*") > -1 && !/\s/.test(x)); 
 
} 
 
// And this is the demo code 
 
var valid = ["123*567", "*hereandthere", "noidea*"]; 
 
var invalid = ["123*567*", "*here and there", "noidea**", "kkkk"]; 
 
valid.map(x => document.body.innerHTML += "<b>" + x + "</b>: " + checkStr(x) + "<br/><b>"); 
 
invalid.map(x => document.body.innerHTML += "<b>" + x + "</b>: " + checkStr(x) + "<br/><b>");

Der POI ist return (x.indexOf("*", x.indexOf("*")+1) === -1 && x.indexOf("*") > -1 && !/\s/.test(x));:

  • x.indexOf("*", x.indexOf("*")+1) === -1 - stellt sicher, dass es keine zwei Sternchen
  • x.indexOf("*") > -1 - stellt sicher, dass es mindestens ein *
  • !/\s/.test(x) - sorgt dort dafür ist kein Leerzeichen in der Zeichenfolge.
Verwandte Themen