通过Regex替换匹配中的单个字符

时间:2012-05-17 14:49:14

标签: regex

我有一个简单的模式,我正在尝试进行查找和替换。它需要用被数字包围的句点替换所有短划线。

替换这些中的句号:

3-54
32-11
111-4523mhz

喜欢如此:

3.54
32.11
111.4523mhz

但是,我不想在这些内容中替换破折号:

Example-One
A-Test

我尝试过使用以下内容:

preg_replace('/[0-9](-)[0-9]/', '.', $string);

然而,这将取代整场比赛,而不仅仅是中场。你怎么只替换比赛的一部分?

4 个答案:

答案 0 :(得分:10)

preg_replace('/([0-9])-([0-9])/', '$1.$2', $string);

应该做的伎俩:)

编辑:更多解释:

在正则表达式中使用(),即可创建一个组。该组可用于替换。 $1被第一个匹配的组取代,$2被第二个匹配的组替换,依此类推。

这意味着如果您(仅举例)将'$1.$2'更改为'$2.$1',则操作将交换这两个数字。 在你的情况下,这不是有用的行为,但也许它可以帮助你更好地理解这个原则。

答案 1 :(得分:2)

根据您正在使用的正则表达式实现,您可以使用非捕获组:

preg_replace('/(?<=[0-9])-(?=[0-9])/', '.', $string);

答案 2 :(得分:0)

您可以使用反向引用来保留您要保留的匹配部分:

preg_replace('/([0-9])-([0-9])/', '$1.$2', $string);

答案 3 :(得分:-1)

以下是实现相同目标的几种方法。

function ValidateFileType(controlName) {
  try {
       var uploadControl = controlName;
       var isCValidFile = false;
       var validFileNames = ["120.jpg","150.jpg","180.jpg","210.jpg","240.jpg"]

       for (var i = 0; i < uploadControl.files.length; i++) {
           var file = uploadControl.files[i];
           var fileName = file.name.split(/(\\|\/)/g).pop().toLowerCase();
           if (validFileNames.indexOf(fileName) < 0) {
              jAlert("Invalid file name, please select etc...",  "Information");
           }
           else if (file.size > 15728640) {
                   jAlert("Please check file size should be less than 15 MB.",  "Information");
           }
           else {
               isCValidFile = true;
           }

           if(!isCValidFile)
               uploadControl.value = '';
       }

       return isCValidFile;

   } catch (e) {
       uploadControl.value = '';
       jAlert("Error occurred on validate file.", "Error");
       return false;
   }
}