ruby-on-rails - Ruby on Rails 中用于客户端服务器的正则表达式

标签 ruby-on-rails regex ruby regex-group client-side-validation

我正在对我的 Rails 应用程序中的名称进行服务器端和客户端验证。目前,我必须复制正则表达式,因为在服务器上运行的常量会引发错误。我怎样才能修改代码,以免出现这种重复?

应用程序/模型/resident.rb

  NAME_FORMAT = /^(?!.*\.\S)[a-zA-Z àâäôéèëêïîçùûüÿæœÀÂÄÔÉÈËÊÏΟÇÙÛÜÆŒößÖẞąćęłńóśźżĄĆĘŁŃÓŚŹŻìíòúÌÍÒÚáñÁÑ \',.-]+$/

  validate :name_is_acceptable, if: -> { (last_name_changed? || first_name_changed?) && (persisted? || !imported?) }
  def name_is_acceptable
    [:first_name, :last_name].each do |attr|
      value = self.send(attr)
      next if value.blank? || value =~ NAME_FORMAT

      errors.add attr, I18n.t(:resident_name_invalid, scope: 'errors.messages')
    end
  end

app/view/resident/_update.html.erb

<%= text_field_tag 'resident[last_name]', nil, class: 'form-control', placeholder: 'Last Name', required: true, maxlength: 50, pattern: '^(?!.*\.\S)[a-zA-Z àâäôéèëêïîçùûüÿæœÀÂÄÔÉÈËÊÏΟÇÙÛÜÆŒößÖẞąćęłńóśźżĄĆĘŁŃÓŚŹŻìíòúÌÍÒÚáñÁÑ \',.-]+$', oninvalid: "setCustomValidity('Contains unsupported characters.')", oninput: "setCustomValidity('')" %>

客户端错误

Pattern attribute value (?-mix:^(?!.*\.\S)[a-zA-Z àâäôéèëêïîçùûüÿæœÀÂÄÔÉÈËÊÏΟÇÙÛÜÆŒößÖẞąćęłńóśźżĄĆĘŁŃÓŚŹŻìíòúÌÍÒÚáñÁÑ \',.-]+$) is not a valid regular expression: Uncaught SyntaxError: Invalid regular expression: /(?-mix:^(?!.*\.\S)[a-zA-Z àâäôéèëêïîçùûüÿæœÀÂÄÔÉÈËÊÏΟÇÙÛÜÆŒößÖẞąćęłńóśźżĄĆĘŁŃÓŚŹŻìíòúÌÍÒÚáñÁÑ \',.-]+$)/: Invalid group

最佳答案

我不太确定你的代码。它可能缺少标志。你的表达似乎没问题:

/^(?!.*\.\S)[a-zA-Z àâäôéèëêïîçùûüÿæœÀÂÄÔÉÈËÊÏΟÇÙÛÜÆŒößÖẞąćęłńóśźżĄĆĘŁŃÓŚŹŻìíòúÌÍÒÚáñÁÑ \',.-]+$/m

ruby 测试

re = /^(?!.*\.\S)[a-zA-Z àâäôéèëêïîçùûüÿæœÀÂÄÔÉÈËÊÏΟÇÙÛÜÆŒößÖẞąćęłńóśźżĄĆĘŁŃÓŚŹŻìíòúÌÍÒÚáñÁÑ \',.-]+$/m
str = 'abcàâä'

# Print the match result
str.scan(re) do |match|
    puts match.to_s
end

正则表达式

您可以在regex101.com 中修改/更改您的表达式.

正则表达式电路

您还可以在 jex.im 中可视化您的表情:

enter image description here

JavaScript 演示

const regex = /^(?!.*\.\S)[a-zA-Z àâäôéèëêïîçùûüÿæœÀÂÄÔÉÈËÊÏΟÇÙÛÜÆŒößÖẞąćęłńóśźżĄĆĘŁŃÓŚŹŻìíòúÌÍÒÚáñÁÑ \',.-]+$/gm;
const str = `abcàâä`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

关于ruby-on-rails - Ruby on Rails 中用于客户端服务器的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56157970/

相关文章:

ruby-on-rails - 如何获得最佳性能 rails 请求并行 sidekiq worker

ruby-on-rails - Rails 3/PhoneGap : Converting a Rails app into an Phonegap iOS app?

regex - 将重复的正则表达式模式捕获为一组,在 bash 脚本中使用 sed

regex - 只显示匹配的字符串 - grep

javascript - 在 RoR 应用程序(c9 IDE)中看不到 JQuery 效果

ruby-on-rails - 具有多个参数的 Rake 执行

ruby-on-rails - 在 Ruby On Rails 中搜索

mysql - 使用连接选择属性并在 rails 中选择

python - 正则表达式捕获组的可选顺序

ruby - 为什么 return 关键字会导致我的 'if block' 出现问题?