正则表达式:只允许单个空格在单词之间。

17

我想写一个正则表达式,只删除单词开头的空格,不删除单词后面的空格,并且在单词后只保留一个空格。

使用的RegExp:

var re = new RegExp(/^([a-zA-Z0-9]+\s?)*$/);

测试例子:

1) test[space]ing - Should be allowed 
2) testing - Should be allowed 
3) [space]testing - Should not be allowed 
4) testing[space] - Should be allowed but have to trim it 
5) testing[space][space] - should be allowed but have to trim it 

只允许一个空格,这可能吗?


你是要匹配还是替换? - sp00m
@sp00m 我只是在尝试匹配.. - coderman
@MichalBrašna 我想允许用户之间有一个空格。 - coderman
应该匹配 a b c 吗? - Steely Wing
8个回答

27

为了匹配你所需的内容,可以使用:

var re = /^([a-zA-Z0-9]+\s)*[a-zA-Z0-9]+$/;

也许你可以把它缩短一点,但它也匹配 _

var re = /^(\w+\s)*\w+$/;

我更喜欢这个解决方案,因为它还允许单字母匹配。 - Tim Pietzcker
2
@falsetru 那就是问题所在,因为 OP 在正则表达式中使用了 ([a-zA-Z0-9]+\s?)* - Michal Brašna
这个完美地运作了! - Rohit Parte

19
function validate(s) {
    if (/^(\w+\s?)*\s*$/.test(s)) {
        return s.replace(/\s+$/, '');
    }
    return 'NOT ALLOWED';
}
validate('test ing')    // => 'test ing'
validate('testing')     // => 'testing'
validate(' testing')    // => 'NOT ALLOWED'
validate('testing ')    // => 'testing'
validate('testing  ')   // => 'testing'
validate('test ing  ')  // => 'test ing'

顺便说一句,如果你使用正则表达式字面量,那么new RegExp(..)是多余的。


@coderman,我更新了答案。之前的答案只匹配两个单词的字符串。 - falsetru
针对有效的“testing”输入,它返回false。 - coderman
@coderman,对我来说它返回“true”。也许你使用的是旧答案? - falsetru
@coderman,没错,应该是test[空格]ing,所以你的答案完全可行。 - coderman
@falsetru 这里的 .test(s) 方法是什么意思?我想在 Java 中写同样的东西。test()match() 相似吗?我能否直接在 Java 中使用 /^(\w+\s?)*\s*$/ 正则表达式,还是必须删除开头和结尾的斜杠? - Ranjit
1
@Ranjit,请移除 ^$。(斜杠是JavaScript正则表达式字面量的一部分,也要移除。)并将 \ 替换为 \\ 。如需更多信息,请发布一个单独的问题。 - falsetru

6

这个不允许单词前后添加空格,只能在单词之间添加一个空格。请随意添加您想要的特殊字符。

^([A-Za-z]+ )+[A-Za-z]+$|^[A-Za-z]+$

demo here


1
如果这是你想要的,它可以更简单:^[A-Za-z]+( [A-Za-z]+)*$ - Matt Jenkins

1

工作代码- 在我的name.addTextChangedListener()内部:

public void onTextChanged(CharSequence s, int start, int before, int count) {
            String n = name.getText().toString();
            if (n.equals(""))
                name.setError("Name required");
            else if (!n.matches("[\\p{Alpha}\\s]*\\b") | n.matches(".*\\s{2}.*") | n.matches("\\s.*")) {
                if (n.matches("\\s.*"))
                    name.setError("Name cannot begin with a space");
                else if (n.matches(".*\\s{2}.*"))
                    name.setError("Multiple spaces between texts");
                else if (n.matches(".*\\s"))
                    name.setError("Blank space at the end of text");
                else
                    name.setError("Non-alphabetic character entered");
            }
        }

你可以尝试将这个适应到你的代码中。

0
const handleChangeText = text => {
    let lastLetter = text[text.length - 1];
    let secondLastLetter = text[text.length - 2];
    if (lastLetter === ' ' && secondLastLetter === ' ') {
      return;
    }
    setInputText(text.trim());
  };

1
虽然这段代码可能回答了问题,但是提供关于它如何或者为什么解决问题的额外背景信息将会提高答案的长期价值。 - blazej
欢迎来到StackOverflow! 请解释您的解决方案。 - Jonathan

0
var f=function(t){return Math.pow(t.split(' ').length,2)/t.trim().split(' ').length==2}

f("a a")
true
f("a a ")
false
f("a  a")
false
f(" a a")
false
f("a a a")
false

这个能正常工作吗?看起来好像缺少一个闭括号。 - jww

0

这是一个不需要正则表达式的解决方案。 将此脚本添加到document.ready函数中,它将起作用。

var i=0;
        jQuery("input,textarea").on('keypress',function(e){
            //alert();
            if(jQuery(this).val().length < 1){
                if(e.which == 32){
                    //alert(e.which);
                return false;
                }   
            }
            else {
            if(e.which == 32){
                if(i != 0){
                return false;
                }
                i++;
            }
            else{
                i=0;
            }
            }
        });

-1

1
欢迎来到Stack Overflow!请阅读[答案]。我,或者其他任何人,为什么要“使用这个”?不要添加这样的非句子,请[编辑]问题以解释为什么这个正则表达式可以实现OP想要做的事情。请记住,你不仅是在回答OP,还在回答任何未来的读者(比如你自己,考虑到这个问题已经6年了)。 - Adriaan
这个愚蠢的 {1} 是一个明显的线性表达式初学者。 - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接