diff --git a/src/applications/project/remarkup/ProjectRemarkupRule.php b/src/applications/project/remarkup/ProjectRemarkupRule.php
--- a/src/applications/project/remarkup/ProjectRemarkupRule.php
+++ b/src/applications/project/remarkup/ProjectRemarkupRule.php
@@ -30,7 +30,7 @@
     // In other contexts, the PhabricatorProjectProjectPHIDType pattern is
     // controlling and these names should parse correctly.
 
-    return '[^\s.\d!,:;{}#\(\)]+(?:[^\s!,:;{}#\(\)][^\s.!,:;{}#\(\)]+)*';
+    return '[^\s.\d!,:;{}#\(\)]+(?:[^\s!,:;{}#\(\)]*[^\s.!,:;{}#\(\)]+)*';
   }
 
   protected function loadObjects(array $ids) {
diff --git a/src/applications/project/remarkup/__tests__/ProjectRemarkupRuleTestCase.php b/src/applications/project/remarkup/__tests__/ProjectRemarkupRuleTestCase.php
--- a/src/applications/project/remarkup/__tests__/ProjectRemarkupRuleTestCase.php
+++ b/src/applications/project/remarkup/__tests__/ProjectRemarkupRuleTestCase.php
@@ -70,6 +70,17 @@
           ),
         ),
       ),
+
+      '#s3' => array(
+        'embed' => array(),
+        'ref' => array(
+          array(
+            'offset' => 1,
+            'id' => 's3',
+          ),
+        ),
+      ),
+
     );
 
     foreach ($cases as $input => $expect) {