字符规则算法在文本处理的应用,很有意思。

看下面图片

我想退格键时,把符号 ”●“ 销点,因为用户按退格键时,可能还要接着前一行继续再写,例如:

现在我要判断按退格键时前面有没有文字,是不是都是特殊字符和空格,或者控制字符,

以前写了很多的功能函数,感觉写不完,可能用字符串匹配可以,但是我很少用,令天突然

我想起写遍历函数的几篇文章,来了灵感,于是在字符串类中添加了一个函数:

/// <summary>
/// 
/// 如果所有字符满足funConditions,则返回 true
/// 
/// 函数原型:
///   bool funConditions(const T& ch) {		}
/// 写法:
///		isAllrules( [](const T& ch)->bool{ return ? } );
/// </summary>
/// <typeparam name="funConditions"></typeparam>
/// <param name="fun"></param>
/// <returns></returns>
/// 创建时间: 2025-04-25      最后一次修改时间: 2025-04-25  已测试( 2025-04-25)
template<class funConditions>
bool isAllRules(funConditions fun) {
	for (size_t i = 0; i < _nLength; ++i) {
		if (!fun(_pData[i]))
			return false;
	}
	return true;
}

然而在QTextEdit中的使用如下:

bool my_QTextEdit::default_do_keyPressEvent_KeyBackspace(QKeyEvent* event)
{
 

  
    /*
    auto s1 = m_currentLineText.getBook_序号标记();
    auto s2 = m_currentLineText.GetBook_序号标记2();
    auto s3 = m_currentLineText.getBook_特殊符号标记();
    auto s4 = m_currentLineText.getBook_章节标记();
    */
    //if(s1.length() == 0 && s2.length() == 0 && s2.length() == 0 && s3.length() == 0)

    QTextEdit::keyPressEvent(event);

    _string s = m_currentLineText.trim();
 

    if (s.length() < 2) {
#ifdef _D_
        //d.printInfo("m_currentLineText.trim() < 2", "bool my_QTextEdit::default_do_keyPressEvent_KeyBackspace(QKeyEvent * event)");
#endif
        this->f_setCurrentCharFormat(m_headlineStyle.mainBody());

    }else if(s.length() < 3) {
#ifdef _D_
        //d.printInfo("m_currentLineText.trim() < 3", "bool my_QTextEdit::default_do_keyPressEvent_KeyBackspace(QKeyEvent * event)");
#endif
        this->f_setCurrLineTextStyle(m_headlineStyle.mainBody());
    }
  

    bool bContainAnySpecial = false; //是否有特殊符号

    //全部是特殊符号或者是空格或者是控制字符
    if (m_currentLineText.isAllRules([&bContainAnySpecial,this](wchar_t& ch)->bool {

        if (gs.c_isControl(ch)) return true; //控制字符

        if (ch == ' ') return true;  //空格

        if (m_specificSymbol.indexOf(ch) != -1) {  //特殊字符

            ch = ' '; //用空格代替特殊符号
            bContainAnySpecial = true;
            return true;
        }

        return false;

        }) && bContainAnySpecial)
    {
        g_setCurrentLineText(this, m_currentLineText + _t(" "));
      
    }
 
     
 
    return true;
}

这个函数很有技巧,很灵活:

编译器调用isAllRues时,先运行lambda表达式,而完成了lambda表达式之后,if语句中第二个参数bContainAnySpecial 也被设置了,还一个神奇的地方是,当查找到有特殊字符时,比如“●”,

会自动把 “●” 变成空格,即:

m_currentLineText =     "      ●  "  => "         "

函数isAllRules扩展性很好:

例如,你可以不断写功能函数:

全是控制字符

	_string s;

	s.isAllRules([](wchar_t& c) {
		if (::iscntrl(c))
			return true;
	});

全是数字,

全是空格

数字或空格

全是可打印字符

可打印字符或格

.......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值