如何在ruby中的特殊字符前后添加空格?

时间:2017-05-02 11:14:54

标签: ruby-on-rails ruby regex

您好我想在字符串

中的特殊字符前后添加空格
  

冷冻/冷藏/环境(请说明)

我希望结果像

  

冷冻/冷藏/环境(请说明)

是否有可能在ruby regexp中添加空间?

4 个答案:

答案 0 :(得分:8)

不需要使用复杂的正则表达式

您可以使用gsub

的块语法
"Frozen/Chilled/Ambient (Please state)".gsub(/\W+/) {|w| " #{w} "}
#=> "Frozen / Chilled / Ambient  ( Please   state ) "

如果要删除重复的空格,可以使用squish

"Frozen/Chilled/Ambient (Please state)".gsub(/\W+/) {|w| " #{w} "}.squish
#=> "Frozen / Chilled / Ambient ( Please state )"

注意:

  • \W - 匹配任何非单词字符
  • squish - 删除周围的空格并将多个空格更改为1

修改

根据评论,如果还可以使用/[[:punct:]]/

 [[:punct:]] =>  [!"\#$%&'()*+,\-./:;<=>?@\[\\\]^_`{|}~]

答案 1 :(得分:4)

尝试 String#gsub

> sample = "Frozen/Chilled/Ambient (Please state)"
#=> "Frozen/Chilled/Ambient (Please state)" 
> sample.gsub!("/", " / ")
#=> "Frozen / Chilled / Ambient (Please state)" 

注意: gsub!将覆盖变量的值本身

更新

根据您的评论,您希望在每个特殊字符之前和之后添加空格:

> pattern = /[^a-zA-Z0-9|(|)|_|\s\-]/
> sample.gsub(pattern){|match|" #{match} "}
#=> "Frozen / Chilled / Ambient (Please state)" 

注意: pattern涵盖所有特殊字符

答案 2 :(得分:4)

试试这个:

sample = "Frozen/Chilled/Ambient (Please state)"
sample.gsub(/([^\w\s])/, ' \1 ')

所有内容都不是\w\wa-z, A-Z, 0-9而非意外核心_)或空格\s。然后gsub用前后空格替换自己找到的元素。

答案 3 :(得分:4)

这可能是一个快速的解决方案。

angular
  .module('myapp', [
    'ui.router',
  ])
  .config(['$stateProvider', '$urlRouterProvider',
    function($stateProvider, $urlRouterProvider) {
      $urlRouterProvider.otherwise('/dashboard/Home');
      $stateProvider
        .state('dashboard', {
          url: '/dashboard',
          templateUrl: 'views/dashboard/main.html', 
        })
        .state('home', {
          parent:'dashboard',
          url: '/Home',
          controller: 'MainCtrl',
          templateUrl: 'views/pages/blank.html',

          }
        })
        .state('login', {
          templateUrl: 'views/pages/login.html',
          url: '/login'
        })
    }
  ]);

几分钟之后,Cary Swoveland会来评论,&#34;嘿,儿子,有足够的字符串方法来解决这个问题,你的解决方案是非常无效的&#34; - ))

对于这种情况,下面的代码片段使用字符串方法,并匹配除了之外的所有内容 字母数字和空格。

<!doctype html>
<html class="no-js">
    <head>
        <meta charset="utf-8">
        <title></title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width">


        <!-- build:css(.tmp) styles/main.css -->
        <link rel="stylesheet" href="styles/libs/bootstrap.min.css" />
        <link rel="stylesheet" href="styles/main.css">
        <link rel="stylesheet" href="styles/sb-admin-2.css">
        <link rel="stylesheet" href="styles/timeline.css">
        <link rel="stylesheet" href="styles/libs/metisMenu.min.css">
        <link rel="stylesheet" href="styles/libs/loading-bar.min.css">
        <link rel="stylesheet" href="styles/libs/font-awesome.min.css" 
        type="text/css">
        <!-- endbuild -->

        <!-- bower:js -->
        <script src="js/libs/jquery.min.js"></script>
        <script src="js/libs/bootstrap.min.js"></script>
        <script src="js/libs/metisMenu.min.js"></script>

        <script src="js/libs/angular.min.js"></script>
        <script src="js/libs/angular-ui-router.min.js"></script>
        <script src="js/libs/ocLazyLoad.min.js"></script>
        <script src="js/libs/loading-bar.min.js"></script>
        <script src="js/libs/ui-bootstrap-tpls.min.js"></script>
        <!-- endbower -->


        <!-- build:js({.tmp,app}) scripts/scripts.js -->
        <script src="scripts/app.js"></script>
        <!-- endbuild -->
    </head>
    <body>
        <div ng-app="ApsilonApp">
            <div ui-view></div>
        </div>
    </body>

</html>

没有块。

"Frozen/Chilled/Ambient (Please state)".split("/").join(" / ")
# => "Frozen / Chilled / Ambient (Please state)"