2016-04-18 7 views
3

Строка может содержать что угодно, но должна содержать одну звездочку (*) по всей строке и что звездочка может находиться где угодно в строке.Регулярное выражение для строки, которая должна содержать только одну звездочку (*)

Также строка не должна содержать пробелов.

допустимы следующие строки:

test* 
*_test 
test*something 

следующие недопустимые строки:

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

Кто-то пожалуйста, помогите мне писать регулярное выражение для вышеуказанного сценария.

+0

Это односимвольная строка, которая является только звездочкой, действительной? – nnnnnn

+0

Значит, это строка, начинающаяся с нуля или более символов, отличных от звездочки, за которой следует одна звездочка, за которой следуют ноль или несколько символов без звездочки? – Pointy

+0

Asterisk может быть в любом месте в строке. Но у него должна быть только одна звездочка. Если в строке нет звездочки, это недопустимо. Кроме того, если в строке больше одной звездочки, это неверно. Если есть одна звездочка то это допустимая строка, она должна возвращать «true» – Deve

ответ

3

Используйте этот RegEx:

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

Live Demo on Regex101

Если вы хотите, чтобы вкладки (все другие пробелы), используйте \s вместо буквального пространства ():

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

Как это работает:

^   # 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 

Демо:

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

В настоящее время вы неправильно сопоставляете строку без звездочки, это должно быть неверно. –

+0

Спасибо, я не могу поверить, что я сделал глупую ошибку! Обновленный ответ! – Druzion

0

Вы можете использовать это:

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

Может быть, запустите несколько тестов для нескольких астерикс или пробелов? – SpoonMeiser

+0

@SpoonMeiser проверить мой обновленный ответ, и спасибо за ваши отзывы, кстати – Ismail

+0

он должен разрешить вкладки. –

1

Вы можете использовать /^[^*\s]*\*[^*\s]*$/, чтобы проверить наличие Strin g, который содержит ровно одну звездочку и пробелов. Если только одна звездочка недействителен, вы должны добавить предпросмотр для проверки наличия у leats двух персонажей, как /^(?=.{2})[^*\s]*\*[^*\s]*$/

См https://regex101.com/r/yE5zV2/1 для некоторых образцов (перейти к юнит-тестов)

+0

'Если только одна звездочка недействительна' ?? ur 1-го регулярного выражения достаточно. –

+0

@ AvinashRaj в соответствии с комментариями строка, содержащая только одну звездочку, не должна совпадать, поэтому я включил это. –

0

условия почти не требуют регулярных выражений (полезно использовать при проверке пробелов).

// 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>");

ТОИ является return (x.indexOf("*", x.indexOf("*")+1) === -1 && x.indexOf("*") > -1 && !/\s/.test(x));:

  • x.indexOf("*", x.indexOf("*")+1) === -1 - не делает, что нет никаких 2 звездочек
  • x.indexOf("*") > -1 - делает, что есть по крайней мере один *
  • !/\s/.test(x) - обеспечивает не является пробелом в строке.
Смежные вопросы